2

線の始点と終点の座標があります。この最後に、互いに垂直になるように別の線を引きたいと思います。

通常のジオメトリを使用してこれを実行しようとしています。同じためにMFCに高レベルのAPIはありますか?

ありがとう

4

4 に答える 4

6

(dx、dy)が与えられた線のxとyの座標の差である場合、その座標の差が(-dy、dx)になるように工夫することにより、別の線を垂直にすることができます。これを任意の係数(-c * dy、c * dx)でスケーリングして、長さを変更できます。

于 2012-09-19T16:06:42.183 に答える
5

(x1、y1)から(x2、y2)への既存の行があります。垂線は(a1、b1)から(a2、b2)で、(x2、y2)を中心にしています。

xdif = x2 - x1
ydif = y2 - y1
a1 = x2 - ydif / 2
b1 = y2 + xdif / 2
a2 = x2 + ydif / 2
b2 = y2 - xdif / 2

私はそれがうまくいくと思います...私はそれを数行テストしました。

したがって、(1,1)から(5,3)に向かう線がある場合、垂線は(5-2 / 2、3 + 4/2)から(5 + 2 / 2、3-4 /)になります。 2)または(4,5)から(6、1)。

于 2012-09-19T20:11:07.950 に答える
0

Win32GDIAPIのSetWorldTransform関数を使用できます。

サンプルコードはこちらです。

于 2012-09-19T16:08:49.047 に答える
0

kbelderの回答に基づいていくつかのC++コードを追加しましょう。原点(x1、y1)と別の頂点(x2、y2)で1つの頂点を作成します

ここに画像の説明を入力してください

float GetDistance(float x1, float y1, float x2, float y2)
{
 float cx = x2 - x1;
 float cy = y2 - y1;
 float flen = sqrtf((float)(cx*cx + cy*cy));
 return flen;
}

void GetAxePoint(double x1, double y1, double x2, double y2, double& x3, double& y3, double vec_len, bool second_is_y)
{
 double xdif = x2 - x1;
 double ydif = y2 - y1;

 if(second_is_y)
 {
  x3 = x1 - ydif;
  y3 = y1 + xdif;
 }
 else
 {
  x3 = x1 + ydif;
  y3 = y1 - xdif;
 }

 double vec3_len = GetDistance(x3, y3, x1, y1);

 x3 = (x3-x1)/vec3_len;
 y3 = (y3-y1)/vec3_len;

 x3 = x1 + x3*vec_len;
 y3 = y1 + y3*vec_len;
}
于 2017-03-06T09:53:19.560 に答える