2011-02-26 11 views
5

Quiero dibujar una línea desde el punto A al punto B. Sin embargo, las líneas en sí deberían ser inteligentes en el sentido de que si el punto B es exactly debajo del punto A, se dibujará una línea recta. Pero si el punto B está debajo de A y ligeramente horizontal desde A, entonces se dibujará una línea en ángulo recto. Espero que me entiendas. Si ha utilizado alguna herramienta UML como edraw Max o cualquier otra, es posible que haya visto este tipo de líneas. ¿Alguna idea de cómo podemos lograr esto?Lógica detrás de líneas complejas

Gracias de

Respuesta

4

Aquí hay algo de código:

void connectPoints(Point a, Point b) 
{ 
    Point middlePoint1(a.x, (a.y + b.y)/2); 
    Point middlePoint2(b.x, (a.y + b.y)/2); 
    drawLine(a, middlePoint1); 
    drawLine(middlePoint1, middlePoint2); 
    drawLine(middlePoint2, b); 
} 

Para aclarar, el autor de la pregunta en realidad quiere ejes alineados con 3 segmentos de líneas que se parecen a la mayoría de las conexiones aquí: style

+0

Tienes razón. Este es el comportamiento exacto deseado. Déjame lo que hace tu código. – TCM

0

bibliotecas de gráficos como GDI + se encargará de que para usted, y se basará la línea de acuerdo a su puntos inicial y final de antemano :).

Si desea manejar esto usted mismo, tiene que trabajar con matemáticas triangulares para determinar el ángulo de rotación de su línea.

+1

No parece la solución que necesita. Creo que realmente quiere conectarse a puntos con líneas rectas (horizontales/verticales) solamente. Aunque la descripción no es muy clara. – Snowbear

+0

@Snowbear: tienes razón. Quiero dibujar líneas horizontales y verticales solamente. Sin líneas cruzadas. – TCM

1

¿Cuál es el problema con el enfoque directo?

// pA, pB - points 
DrawLine(pA.X, pA.Y, pA.X, pB.Y); // vertical line from A point down/up to B 
DrawLine(pA.X, pB.Y, pB.X, pB.Y); // horizontal line to B 
+0

+1 La idea básica es correcta. Un tema más complicado es, ¿cómo maneja OP los diagramas en los que se dibujan varias líneas que pueden colisionar? Para estas líneas ortogonales, hay dos líneas que puede dibujar: por ejemplo, hacia abajo y hacia la derecha, hacia la derecha y hacia abajo. Ahora tiene 1000 de estos para dibujar, dándole un espacio de 2^1000 configuraciones posibles. ¿Cuál dibuja para minimizar las superposiciones de líneas? ¿Cuál dibuja para evitar las líneas con colisiones de puntos de esquina? El problema difícil es este problema de diseño. –

+0

@Ira, es difícil responder preguntas sin responder. Estoy de acuerdo en que, en general, este problema es complicado, pero esta pregunta en particular no tiene tantos detalles, así que asumí que la manera más fácil puede ser suficiente aquí. Otras soluciones pueden ser sobredimensionadas ya que no sabemos lo que realmente necesita. – Snowbear

1

Es esto lo que quiere decir por la inteligencia en ángulo recto? seudo sobreviene ...

Point pA(x,y); 
Point pB(x,y); 
if abs(pB.X-pA.X) < abs(pB.Y-pA.Y) // Going vertically or horizontal? 
{ 
    DrawLine(pA.X, pA.Y, pA.X, pB.Y); //Long vertical 
    DrawLine(pA.X, pB.Y, pB.X, pB.Y); //Short horizontal 
} 
else 
{ 
    DrawLine(pA.X, pA.Y, pB.X, pA.Y); //Long horizontal 
    DrawLine(pB.X, pA.Y, pB.X, pB.Y); //Short vertical 
} 

o para la línea torcida (de la parte superior de mi cabeza):

Point pA=(x,y); 
Point pB=(x,y) 
if abs(pB.X-pA.X) < abs(pB.Y-pA.Y) // Going vertically or horizontal? 
{ 
    Point pHalfwayY = (pB.Y-pA.Y)/2 + pB.Y 
    DrawLine(pA.X, pA.Y, pA.X, pHalfwayY); //Long vertical 1st half 
    DrawLine(pA.X, pHalfwayY , pB.X, pHalfwayY); //Short horizontal 
    DrawLine(pA.X, pHalfwayY , pA.X, pB.Y); //Long vertical 2nd half 
} 
else 
{ 
    Point pHalfwayX = (pB.X-pA.X)/2 + pB.Y 
    DrawLine(pA.X, pA.Y,pHalfwayX , pA.Y); //Long horizontal 1st Half 
    DrawLine(pHalfwayX , pA.Y, pHalfwayX , pB.Y); // Short Vertical 
    DrawLine(pHalfwayX , pA.Y, pA.X, pB.Y); //Long horizontal 2nd half 
} 

Espero que esto ayude.

Cuestiones relacionadas