绘制垂直于给定线的线
Posted
技术标签:
【中文标题】绘制垂直于给定线的线【英文标题】:Drawing line perpendicular to a given line 【发布时间】:2012-09-19 16:01:39 【问题描述】:我有一条线的起点和终点坐标。我想在这个末端画另一条线,这样它们就会相互垂直。
我正在尝试使用普通几何体来做到这一点。 MFC 中是否有相同的高级 API。
谢谢
【问题讨论】:
听起来像是两行餐巾纸计算...值得为此使用专用 API 吗? 抱歉,这个问题已经被问过了***.com/questions/133897/… 【参考方案1】:如果 (dx,dy) 是给定线的 x 和 y 坐标的差,您可以通过将其坐标的差设为 (-dy, dx) 来使另一条线垂直。您可以按任何因子(-c*dy、c*dx)对其进行缩放以更改其长度。
【讨论】:
【参考方案2】:您有一条从 (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)。
【讨论】:
【参考方案3】:您可以使用 Win32 GDI API 中的SetWorldTransform 函数。
示例代码为here。
【讨论】:
【参考方案4】:让我添加一些基于 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;
【讨论】:
以上是关于绘制垂直于给定线的线的主要内容,如果未能解决你的问题,请参考以下文章