- ベストアンサー
指定した範囲の反転について
C++、Win32APIで作っています。 ウィンドウにいくつかの線を書き、その後ドラッグした範囲(四角い)の線の始めと終わりの点だけを反転させるプログラムを組みたいのですが、どのようにすればよいのでしょうか? 線を書くところまではできるのですが、ドラッグした範囲のみ反転の仕方がわかりません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
判定逆でしたね。 if (x>=X1 && x<=X2 && y>=Y1 && y<=Y2) { hPen=CreatePen(PS_SOLID,1,反転色値); SelectObject(hPen); PolyLine(x,y); } else { hPen=CreatePen(PS_SOLID,1,標準色値); SelectObject(hPen); PolyLine(x,y); } DeleteObject(hPen); とできますが、もし線分上の1点でも拾えば・・・という条件 ならば for (i=x1,j=(x2-x1)/(y2-y1);i<=x2;i++) { if (!(i % j) & i) j++; if (i>=X1 && i<=X2 && j>=Y1 && j<=Y2) { hPen=CreatePen(PS_SOLID,1,反転色値); SelectObject(hPen); PolyLine(x,y); } else { hPen=CreatePen(PS_SOLID,1,標準色値); SelectObject(hPen); PolyLine(x,y); } DeleteObject(hPen); } でした。
その他の回答 (2)
#1です。 すみません勘違いでした。 その線分 (x1,y2)-(x2,y2) の始終点座標(x,y)は分かっているものとすれば、 ドラッグ範囲 (X1,Y1)-(X2,Y2) において if (x>=X1 && x<=X2 && y>=Y1 && y<=Y2) { hPen=CreatePen(PS_SOLID,1,標準色値); SelectObject(hPen); PolyLine(x,y); } else { hPen=CreatePen(PS_SOLID,1,反転色値); SelectObject(hPen); PolyLine(x,y); } DeleteObject(hPen); とできますが、もし線分上の1点でも拾えば・・・という条件 ならば for (i=x1,j=(x2-x1)/(y2-y1);i<=x2;i++) { if (!(i % j) & i) j++; if (i>=X1 && i<=X2 && j>=Y1 && j<=Y2) { hPen=CreatePen(PS_SOLID,1,標準色値); SelectObject(hPen); PolyLine(x,y); } else { hPen=CreatePen(PS_SOLID,1,反転色値); SelectObject(hPen); PolyLine(x,y); } DeleteObject(hPen); } でしょうか。
線分(X1,Y1)-(X2,Y2) のおいて CreatePen関数で作成した標準色ペンを適用し PolyLine関数で、 (X1+1,Y1)-(X2-1,Y1) (X2,Y1+1)-(X2,Y2-1) (X2-1,Y2)-(X+1,Y2) (X1,Y2-1)-(X1,Y1+1) の順で線画して 次に CreatePen関数で作成した反転色(標準色 XOR 0xffffffff)ペンを 適用し PolyLine関数で、 (X1,Y1) (X2,Y2) とやればいきますが・・・。