2011-02-26 8 views
5

Chcę narysować linię od punktu A do punktu B. Jednak same linie powinny być inteligentne w tym sensie, że jeśli punkt B to exactly poniżej punktu A, należy wyciągnąć prostą linię. Ale jeśli punkt B znajduje się poniżej A i niewiele dalej poziomo od A, wówczas linia powinna zostać narysowana w sposób pod kątem prostym. Mam nadzieję, że mnie zdobędziesz. Jeśli korzystałeś z dowolnego narzędzia UML, takiego jak edraw Max lub jakikolwiek inny, możesz zobaczyć te typy linii. Każdy pomysł, jak możemy to osiągnąć?Logika za złożonymi liniami

góry dzięki :)

Odpowiedz

4

Oto niektóre kodu:

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); 
} 

celu wyjaśnienia, pytający rzeczywiście chce oś wyrównany 3-segmentowe linie, które wyglądają podobnie jak większość połączeń tutaj: style

+0

Masz rację. Jest to dokładnie pożądane zachowanie. Pozwól mi, co robi twój kod. – TCM

0

bibliotek graficznych takich jak GDI + będzie obsługiwać to dla ciebie, i to narysować linię w zależności od jego rozpoczęcia i zakończenia. Punktów

Jeśli chcesz poradzić sobie samemu, musisz pracować z trójkątem matematycznym, aby określić kąt obrotu linii.

+1

To nie brzmi jak rozwiązanie, którego potrzebuje. Wierzę, że on rzeczywiście chce łączyć się z punktami tylko liniami prostymi (poziomymi/pionowymi). Chociaż opis nie jest zbyt jasny. – Snowbear

+0

@Snowbear: Masz rację. Chcę rysować tylko linie poziome i pionowe. Bez linii poprzecznych. – TCM

1

Na czym polega problem z prostym podejściem?

// 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 Podstawowy pomysł jest już gotowy. Bardziej skomplikowanym tematem jest to, w jaki sposób OP obsługuje diagramy, w których może rysować się wiele linii? W przypadku tych linii ortogonalnych istnieją dwie linie, które mógłby narysować: np. W dół i w prawo, w prawo iw dół. Teraz ma ich 1000 do narysowania, dając mu przestrzeń 2^1000 możliwych konfiguracji. Którego losuje, aby zminimalizować nakładanie się linii? Którego losuje, aby uniknąć linii z kolizjami w punkcie narożnym? Trudnym problemem jest ten problem z układem. –

+0

@Ira, trudno jest odpowiedzieć na niezadane pytanie. Zgadzam się, że ogólnie ten problem jest skomplikowany, ale to konkretne pytanie nie ma aż tak wielu szczegółów, więc założyłem, że najłatwiejszy sposób może tutaj wystarczyć. Inne rozwiązania mogą być zbyt zaawansowane, ponieważ nie wiemy, czego naprawdę potrzebuje. – Snowbear

1

Czy to co masz na myśli przez prawoskrętną inteligencję? pseudo nastąpić ...

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 
} 

lub dla linii krzywym (od szczytu głowy):

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 
} 

nadzieję, że to pomaga.