PDA

Ver la Versión Completa : Plano cartesiano


RSC9421
24-06-2014, 20:56:50
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 (http://www.clubdelphi.com/foros/guiaestilo.php).

Si no interpreté mal tu consulta, una opción puede ser:

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:

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
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
...
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 (http://www.clubdelphi.com/foros/showthread.php?t=82106)

Saludos :)

RSC9421
26-06-2014, 19:04:19
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:

...
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, ya lo pude solucionar :)