Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   recorrer una linea creada en un canvas (https://www.clubdelphi.com/foros/showthread.php?t=91020)

Snaked 04-11-2016 14:58:01

ecfisa: has visto porque las naves salen desplazadas??? será cuestion del PARENT este?

Código PHP:

void Ship::setParentTWinControlparent )
{
  
_image->Parent parent;



ecfisa 04-11-2016 15:42:23

Hola Snaked.

Lo siento no pude verlo, el enlace de tu mensaje dice: "El video que has solicitado no está disponible.", pero voy a revisar el código a ver si me hace lo mismo.

Saludos :)

ecfisa 04-11-2016 16:15:05

Hola.

Acabo de hacer una prueba,
Código PHP:

...
void __fastcall TForm1::btnStartClickTObject *Sender )
{
  
// trayectoria (linea)
  
Canvas->MoveTo(  10100 ); Canvas->LineTo240200 );

  
// nave (por la misma trayectoria )
  
Ships1 = new ShipthisPoint(10100 ), Point240200 ) );
  
s1->LoadImage "face-smile.jpg";
  
s1->Timer->Interval 10;
  
s1->Timer->Enabled  true;
}
... 

Y pareciera que la imágen sigue la línea mas o menos por el medio...


Saludos :)

aguml 04-11-2016 21:43:56

Yo creo que si puede ser el parent porque supongo que tiene un tpanel o algo y dependiendo de si el parent es el form o el panel puede variar su Top y su Left.

ecfisa 04-11-2016 23:15:48

Hola aguml.

Siempre que dibuje sobre el lienzo del mismo padre no se altera el resultado, por ejemplo le aquí asigno un TPanel como parent:



Ahora si, como mencionaste antes, esta dibujando la trayectoria en un componente y la nave en otro, si que podría haber diferencia en las posiciones debido a la relatividad de las coordenadas...

Saludos :)

Snaked 05-11-2016 10:20:52

jejejej.... hola ecfisa y Aguml...... aun ando a vueltas con el tema este de las "rutas"

os explico:

tengo en el form, un tImage que es el que utilizo como TABLERO donde dibujo los planetas y las rutas y la estacion espacial (Image->tablero) que esta situado en LEFT = 0; TOP = 28; WIDTH =1058; HEIGHT = 570;

encima de este timage tengo un elemento (barra) de interface donde muestra el nombre del sector y luego está los bordes de la ventana del form

entonces, teniendo en cuenta estos datos...... como tendria que poner el POINT() de las rutas?

no acabo de aclararme con esto de coordenadas relativas


he probado a poner en el parent de Ship( Image->tablero->Parent, Point(), Point()); pero parece ser el mismo resultado que poniendo THIS

Snaked 05-11-2016 11:04:34

mirad.... he creado un proyecto con el nucleo del dibujado

echadle un vistazo

http://www.qualinost.tk/descargas/prueba_rutas.rar

aguml 05-11-2016 15:09:27

No puedo probar nada porque estoy recién operado y con el pie en alto pero yo diría que el fallo lo tienes justo en la línea que comentas. Le indicas que el parent es el parent del tImage con lo que en tu caso es el tform. Por lo que explicas supongo que tu form se llama Image y el TImage se llama tablero ¿no? Prueba asi:
Ship( Image->tablero, Point(), Point());
O directamente:
Ship( tablero, Point(), Point());

Snaked 07-11-2016 00:07:03

estoy seguro que hay algo erroneo con el parent en la funcion de ecfisa porque veo esto:

Código PHP:

#include <jpeg.hpp>

const int MAX_X 1366;

class 
Ship {
private:
  
TImage*      _image;
  
TTimer*      _timer;
  
TWinControl_parent;
  
TPoint       _route[MAX_X];
  
TPoint       _start;
  
TPoint       _stop;
  
int          _inx;
  
int          _toproute;
  
int calcRoute();
  const 
TPoint &getPt( const int &ix );
  
void setParentTWinControlparent );
  
void __fastcall _timerTimer(TObject *Sender);
public:
  
ShipTWinControlparent, const TPointstart, const TPointstop);
  ~
Ship();
  
__property TWinControlParent = { read _parentwrite setParent };
  
__property TImageImage = { read _imagewrite _image };
  
__property TTimerTimer = { read _timerwrite _timer };
  
__property int TopRoute = { read _toproute };
  
__property TPoint Route[int] = { read getPt };
};

#endif 


donde veo declarada la funcion setParent(TWinControl* parent) pero no veo por ningun sitio donde la invocaria para cambiar el parent del timage

porque ademas.....en el codigo...tengo esto puesto como ha indicado Aguml lo del parent

Código PHP:

 s1 = new Shiptablero->ParentPoint(40 Form2->Image2->Picture->Graphic->Width/2,40 Form2->Image2->Picture->Graphic->Height/2), Point(240 Form2->Image3->Picture->Graphic->Width/2410 Form2->Image3->Picture->Graphic->Height/2)  );
 
s2 = new Shiptablero->ParentPoint(240 Form2->Image3->Picture->Graphic->Width/2410 Form2->Image3->Picture->Graphic->Height/2), Point(480 Form2->Image4->Picture->Graphic->Width/2100 Form2->Image4->Picture->Graphic->Height/2) );
 
s3 = new Shiptablero->ParentPoint(240 Form2->Image3->Picture->Graphic->Width/2410 Form2->Image3->Picture->Graphic->Height/2), Point(600 Form2->Image11->Picture->Graphic->Width/2350 Form2->Image11->Picture->Graphic->Height/2) ); 

indicando el parent del TImage "TABLERO" pero pese a todo creo que lo dibuja en un Canvas diferente.....creo que el del Form.....porque una de las naves se sale del TImage Tablero y se ve como "vuela" por encima del formulario Tform1 (cuando si fuese dentro del TImage Tablero, al salir de los limites del image no tendria que verse la nave no?

ecfisa.... cual puede ser el problema?

aguml 07-11-2016 00:34:28

Prueba y cambia esto:
Código PHP:

 s1 = new Shiptablero->ParentPoint(40 Form2->Image2->Picture->Graphic->Width/2,40 Form2->Image2->Picture->Graphic->Height/2), Point(240 Form2->Image3->Picture->Graphic->Width/2410 Form2->Image3->Picture->Graphic->Height/2)  ); 

Por:
Código PHP:

s1 = new ShiptableroPoint(40 Form2->Image2->Picture->Graphic->Width/2,40 Form2->Image2->Picture->Graphic->Height/2), Point(240 Form2->Image3->Picture->Graphic->Width/2410 Form2->Image3->Picture->Graphic->Height/2)  ); 


ecfisa 07-11-2016 00:40:28

Cita:

Empezado por Snaked (Mensaje 510484)
estoy seguro que hay algo erroneo con el parent en la funcion de ecfisa porque veo esto:
...
donde veo declarada la funcion setParent(TWinControl* parent) pero no veo por ningun sitio donde la invocaria para cambiar el parent del timage...

El parent es asignado en el constructor:
Código:

Ship( TWinControl* parent, const TPoint& start, const TPoint& stop);
y despues lo podes cambiar invocando a la propiedad Parent:
Código:

...
  __property TWinControl* Parent = { read = _parent, write = setParent };
...

Saludos :)

Snaked 07-11-2016 09:38:33

muy gracioso ecfisa. .. .jajajajaj...me parto cabronazo


Código PHP:

  for(c=0_start.x_stop.xc++, x++ ) {
    
int y _start.dy * ( _start.) / dx;
    
_route[c]._startx.x;  <---- linea que me ha hecho perder casi 1 semana
    _route
[c].y;
  } 

pero bueno, me he puesto a mirar el codigo hasta que lo he encontrado yo mismo

aqui os dejo por fin, un video de la salida correcta de las famosas "rutas"


https://youtu.be/D2vJIpDC3uI

Snaked 07-11-2016 11:23:06

Ecfisa:

ahora se me plantea otra cosa.... el dibujado de las rutas en pantalla lo tengo, pero ahora, se me plantea el interrogante de calcular el recorrido por otros SECTORES que no se ven en pantalla pero que aun asi, tendria que calcular las rutas en un lugar "aparte" que no sea visible (un vector quizas?) para que aunque no se vean en pantalla....el proceso de "navegacion" de las naves lleve su tiempo en background

Es decir si una nave sale de LA TIERRA (Sector Vega) en principio, al tener ese sector en pantalla.....vemos la nave por las rutas....bien...ahora cuando salga del sector VEGA.... como puedo hacer para que siga trazando las rutas sin mostrar nada en pantalla pero que es como si la nave siguiese trazando las rutas para que llegado un tiempo mas tarde.....cambiemos por ejemplo al SECTOR OMEGA (destino) y cuando corresponda la veamos "llegar"?

Aguml, tambien va por ti o por vosotros, los que esteis siguiendo este hilo

a ver que ideas me dais que sean elegantes y sencillas de implementar

el Quiz de la cuestión.....es que cada nave lleve una velocidad (eso lo logramos con la velocidad del TTimer incrustado en cada objeto "Ship" que nos dio ecfisa pero necesito una forma de calcular todas las trayectorias a través de los sectores galacticos y mostrar solo las naves cuando Visualicemos un SECTOR en pantalla y haya alguna "nave" pasando por las rutas de ese SECTOR

y gracias tios, me estais ayudando un monton....gracias por estar ahi

ecfisa 07-11-2016 13:42:23

Hola Snaked.

Para calcular las rutas podes usar una variante de la función movepixel del mensaje #3 :

Código PHP:

int calculateRoute( const TPointp1, const TPointp2TPointvp )
{
  
int dx p2.p1.x;
  
int dy p2.p1.y;
  
int ix 0;

  for( 
int x p1.xp2.x++ ) {
    
int y p1.dy * ( p1.) / dx;
    
vp[ix].x;
    
vp[ix].y;
    
ix++;
  }
  return 
ix;
}

// Ejemplo de uso:
...
{
  
TPoint ruta[1366];
  
int top =  calculateRoutePoint1010 ), Point500100 ),  ruta );
... 

Saludos :)

Snaked 07-11-2016 13:50:27

entiendo, voy a probar a ver que resulta

una cosilla.... en esta linea:

Código PHP:

TPoint ruta[1366];  //porque 1366?? por el ancho maximo de la pantalla? 

y otra cosa....

Código PHP:

int top =  calculateRoutePoint1010 ), Point500100 ),  ruta ); 

entiendo que top almacena el resultado final de ix pero que es exactamente? bueno....se que es el numero de iteraciones del bucle for pero para que lo almacenas en un int?

ecfisa 07-11-2016 13:57:12

Hola.

La cantidad de elementos que fueron almacenados en el arreglo "ruta".

Saludos :)

ecfisa 07-11-2016 15:10:03

Hola de nuevo.

Se me pasó tu primer consulta... Si, 1366 es el ancho máximo de pantalla del equipo en que estoy en este momento.
Para hacerlo portable podrías usar un arreglo dinámico, pero eso es otro tema que el que nos trae.

Saludos :)

Snaked 08-11-2016 14:39:42

vale ecfisa.... voy a ver si avanzo algo en el juego ya que tengo mas o menos las funciones ya implementadas

Aguml, siento que estes "de baja" y te deseo que te recuperes pronto de tu operacion.


La franja horaria es GMT +2. Ahora son las 21:01:13.

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