将一条线变成一个矩形。

10

我有一个绘制两点间线段的方法。这很有效,但现在我想把这条线变成一个矩形。

如何获取每个线段点左侧和右侧的点,以使其成为一个可以绘制的矩形?

似乎需要编程方式计算出垂直线....


2
小心,IBM已经申请了专利!http://www.forbes.com/asap/2002/0624/044.html - just somebody
3
那太疯狂了……大量的毒品应该对每个人免费开放。 - Mel
我可能在这里解释得有些混乱。该线位于矩形中间。因此,想象一个矩形,一条线将其纵向切成两半,而不是对角线。 - Mel
3个回答

17

我猜你想要的是粗线条?假设这条线由两个点(x0, y0)(x1, y1)定义,那么我们有:

float dx = x1 - x0; //delta x
float dy = y1 - y0; //delta y
float linelength = sqrtf(dx * dx + dy * dy);
dx /= linelength;
dy /= linelength;
//Ok, (dx, dy) is now a unit vector pointing in the direction of the line
//A perpendicular vector is given by (-dy, dx)
const float thickness = 5.0f; //Some number
const float px = 0.5f * thickness * (-dy); //perpendicular vector with lenght thickness * 0.5
const float py = 0.5f * thickness * dx;
glBegin(GL_QUADS);
glVertex2f(x0 + px, y0 + py);
glVertex2f(x1 + px, y1 + py);
glVertex2f(x1 - px, y1 - py);
glVertex2f(x0 - px, y0 - py);
glEnd();

由于你使用OpenGL ES,我猜你将不得不将立即模式渲染(glBeginglEnd等)转换为glDrawElements。您还需要将四边形转换为两个三角形。

最后一件事,我有点累了,不确定结果四边形是逆时针还是顺时针,所以在尝试时关闭背面剔除(glDisable(GL_CULL))。


3
安德烈亚斯,我需要把“(-dy)”替换成“(dy)”。我认为这是因为你使用的是“y0 + py”而不是“y0 - py”。 - ChrisJJ
2
@ChrisJJ是正确的,我试图修复答案,但编辑被拒绝了。更改glVertex2f方法中“x”参数的符号以匹配“y”参数的符号。 glVertex2f(x0 + px,y0 + py); glVertex2f(x1 + px,y1 + py); glVertex2f(x1-px,y1-py); glVertex2f(x0-px,y0-py); - Ryan Clarke
@Ryan,拒绝的原因是什么? - ChrisJJ
@ChrisJJ“这次编辑旨在针对帖子的作者,作为编辑是没有意义的。它应该被写成评论或答案。”它以3比2的投票结果被否决了。我不知道为什么修复错误代码“没有意义”。我刚刚尝试再次编辑它。 - Ryan Clarke

-1

既然你使用了OpenGL标签来提问,我会假设你希望得到一个接近OpenGL的解决方案。

如你所知,你有两个点组成一条线段。我们称它们为x1,y1和x2,y2。

我们还假设x1,y1是左上角点,x2,y2是右下角点。

你需要绘制4个点[为了使用GL_LINES绘制矩形,必须保持顺序]。

Height:y1-y1   
Width: x2-x1 

(x1, y1)
(x1+width, y1)
(x2, y2)
(x2-width, y2)

-2

drawRect(x,y,w,h)

tl = (x,y) tr = (x+w, y) br = (x+w, y+h) bl = (x, y+h)

绘制矩形(x,y,w,h)

左上角 = (x,y) 右上角 = (x+w, y) 右下角 = (x+w, y+h) 左下角 = (x, y+h)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接