線の始点と終点の座標があります。この最後に、互いに垂直になるように別の線を引きたいと思います。
通常のジオメトリを使用してこれを実行しようとしています。同じためにMFCに高レベルのAPIはありますか?
ありがとう
線の始点と終点の座標があります。この最後に、互いに垂直になるように別の線を引きたいと思います。
通常のジオメトリを使用してこれを実行しようとしています。同じためにMFCに高レベルのAPIはありますか?
ありがとう
(dx、dy)が与えられた線のxとyの座標の差である場合、その座標の差が(-dy、dx)になるように工夫することにより、別の線を垂直にすることができます。これを任意の係数(-c * dy、c * dx)でスケーリングして、長さを変更できます。
(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)。
Win32GDIAPIのSetWorldTransform関数を使用できます。
サンプルコードはこちらです。
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;
}