Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Plano cartesiano (https://www.clubdelphi.com/foros/showthread.php?t=86158)

RSC9421 24-06-2014 20:56:50

Plano cartesiano
 
Buenas, soy nuevo en el foro(ya lei lo correspondiente) (esa fue toda mi presentacion)
vengo de utilizar visual basic 6 pero no me gusta mucho, y tengo un problema, quiero dibujar un plano cartesiano en un timage y dibujar diferentes posiciones para la misma linea, el problema es que el timage como todas las cosas empieza a contar desde donde comienza a dibujarse el image(superior izquierda) y yo quiero dibujar las lineas desde un punto (x,y) que sera el centro del timage y empezar a dibujar las lineas tomando como referencia a la derecha valores positivos y a la izquiera valores negativos para el eje x como estamos acostumbrados, estoy usando delphi7(se que puedo dibujar las lineas con canvas y el moveto(x1,y1) y lineto(x2,y2) similar a lo que venia haciendo)
la idea principal es hacer cinematica inversa con 2 articulaciones, es decir, dada la punta de un brazo dibujada con 2 lineas saber los angulos de la linea 1 y la linea 2, lo hice en visual basic 6 pero es muy limitado y si sigo haciendo las cosas que quiero hacer me voy a ahogar en un vaso de agua :D
saludos

ecfisa 24-06-2014 22:05:17

Hola RSC9421, bienvenido a Club Delphi :)

Como es costumbre con los que se inician, te invitamos a leer nuestra guía de estilo.

Si no interpreté mal tu consulta, una opción puede ser:
Código Delphi [-]
function GetRectCoord(const Img: TImage; const x,y: Integer): TPoint;
begin
  Result.X:= (Img.Width - Img.Canvas.Pen.Width) div 2;
  Result.Y:= (Img.Height - Img.Canvas.Pen.Width) div 2;
  if x < Result.X then
    Inc(Result.X, x)
  else
    Dec(Result.X, x);
  if y < Result.Y then
    Dec(Result.Y, y)
  else
    Inc(Result.Y, y);
end;

Ejemplo de uso:
Código Delphi [-]
var
  P1,P2: TPoint;
begin
  P1:= GetRectCoord(Image1,-60,-60);
  P2:= GetRectCoord(Image1,25,25);
  Image1.Canvas.MoveTo(P1.X, P1.Y);
  Image1.Canvas.LineTo(P2.X, P2.Y);
  ...

Saludos :)

RSC9421 24-06-2014 23:21:48

muy bueno
 
gracias, me sirvio muchisimo y pude entender el codigo :D el prog ya esta funcionando, pero tengo otro problema, como hago para borrar la linea que acabo de crear cuando se crea otra linea
gracias por la respuesta, intentare solucionarlo ^\||/

ecfisa 25-06-2014 01:15:21

Cita:

Empezado por RSC9421 (Mensaje 478288)
...
como hago para borrar la linea que acabo de crear cuando se crea otra linea
...

Hola RSC9421.

Revisa en este hilo: Cómo borrar y cambiar el color de una linea

Saludos :)

RSC9421 26-06-2014 19:04:19

gracias
 
gracias, tengo una duda(perdon por ser tan pesado ^^ ) hay alguna forma de crear una sola linea y manejar solamente esa linea?seria mas facil que estar dibujando y borrando la linea todo el tiempo, seria como hacer un reloj analogico, el problema es que el reloj sabe cuando cuando dibujar y cuando borrar(definido por un tiempo), en el caso que estoy haciendo es dibujar y borrar la linea cuando presiono una tecla,
el procedimiento para un reloj seria
dibujar la linea negra
esperar
dibujar la linea transparente
el tema es que no puedo definir el (esperar) cuando este presionando una tecla, por eso, si podria crear una sola linea1 y manejar a gusto esa linea1 seria lo ideal
saludos

ecfisa 27-06-2014 03:35:54

Hola RSC9421.

No veo la dificultad en borrar y dibujar una linea ante la presión de una tecla como por ejemplo hago en este código:
Código Delphi [-]
...
implementation

const
  INCR = PI / 15;

var
  Center: TPoint;
  Posic : TPoint;
  Radio : Integer;
  Cont  : Single;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Canvas.Pen.Style:= psSolid;
  Canvas.Pen.Color:= clBlack;
  Center:= Point(Width div 2, Height div 2);
  Posic:= Point(0, 0);
  Radio:= 100;
  Cont:= PI;
  KeyPreview:= True;
end;

procedure DrawLine(CV: TCanvas; const Ini,Fin: TPoint; const aColor: TColor);
begin
  CV.Pen.Color:= aColor;
  CV.MoveTo(Ini.X,Ini.Y);
  CV.LineTo(Fin.X, Fin.Y);
  CV.Ellipse(Fin.X-5,Fin.Y-5,Fin.X+5,Fin.Y+5);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  DrawLine(Canvas, Center, Posic, clBtnFace);
  Posic.X:= Center.X + Trunc(Radio * sin(Cont));
  Posic.Y:= Center.Y + Trunc(Radio * cos(Cont));
  DrawLine(Canvas, Center, Posic, clBlack);
  if Key = VK_RIGHT then
    Cont:= Cont - INCR
  else if Key = VK_LEFT then
    Cont:= Cont + INCR;
end;
...

Saludos :)

RSC9421 30-06-2014 03:49:42

gracias
 
gracias, ya lo pude solucionar :)


La franja horaria es GMT +2. Ahora son las 19:40:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi