2011-02-26 6 views
5

点Aから点Bまで直線を描画したいと思います。ただし、点Bが点Aの下にexactlyであれば直線が描画されるはずです。しかし、点BがAよりも小さく、Aから水平方向に少し離れていれば、線は直角に描かれるはずです。私はあなたが私を得ることを願っています。 edraw MaxなどのUMLツールを使用したことがある場合は、これらのタイプの行を見たことがあります。どのようなアイデアをどのように達成することができますか?事前:) +はあなたのためにそれを処理すると、それはその始点と終点に応じて線を描画しますGDIのような複雑な線の背後にある論理

答えて

4

がここにいくつかのコードです:

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

明確にするために、アスカーは実際にここにほとんどの接続のように見える3セグメント軸整列ラインを望んでいる: style

+0

あなたは正しいです。これは、まさに望ましい動作です。あなたのコードが何をしているか教えてください。 – TCM

0

グラフィックライブラリで

感謝。

これを自分で処理したい場合は、線の回転角度を決定するために三角演算を行う必要があります。

+1

彼は必要な解決策のようには聞こえません。私は彼が実際に直線(水平/垂直)線だけでポイントに接続したいと思う。説明はあまり明確ではありませんが。 – Snowbear

+0

@スノーベア:そうです。水平線と垂直線だけを描きたい。クロスラインはありません。 – TCM

1

簡単なアプローチの問題点は何ですか?

// 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基本的な考え方は正しいです。より複雑なトピックは、複数の線が描画された図をOPがどのように処理するかです。これらの直交線については、彼が描くことができる行は2つあり、例えば、下と右、右と下である。今では彼に1000個の描画があり、2^1000の可能な構成が可能です。行の重なりを最小限に抑えるために、どちらを描画しますか?コーナーポイントの衝突で線を避けるために、どちらを描画しますか?難しい問題はこのレイアウトの問題です。 –

+0

@Ira、それは覆われていない質問に答えるのは難しいです。私はこの問題は一般的には複雑であることに同意しますが、この特定の質問はそれほど詳細ではないので、ここでは最も簡単な方法で十分だろうと思いました。私たちは彼が本当に必要なものを知らないので、他の解決策が強調されるかもしれません。 – Snowbear

1

はあなたが何を意味するか、このです直角の知性によって?擬似は

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 
} 

か(私の頭の上から)曲がったラインのために...結果として起きる:

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 
} 

・ホープ、このことができます。

関連する問題