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

您可以使用Win32 GDI API 中的SetWorldTransform函数。

示例代码在这里

于 2012-09-19T16:08:49.047 回答
0

让我添加一些基于 kbelder 答案的 c++ 代码。它通过原点 (x1,y1) 和另一个顶点 (x2,y2) 创建一个顶点

在此处输入图像描述

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 回答