绘制N宽线?

时间:2010-06-05 20:13:10

标签: c++ c algorithm drawing

给定一系列点数,我怎样才能计算出距离5个像素的那条线的矢量?例如: 给出:

   \
    \
     \

我怎样才能找到

的矢量
   \  \
    \  \
     \  \

右边的那些。

我正在试图弄清楚像Flash这样的程序如何制作厚实的轮廓。

由于

4 个答案:

答案 0 :(得分:8)

粗线是多边形。 (现在让我们忘记抗锯齿)

picture http://img39.imageshack.us/img39/863/linezi.png

start = line start = vector(x1,y1)
end = line end = vector(x2,y2)
dir =行方向=结束 - 开始=向量(x2-x1,y2-y1)
ndir = normalized direction = dir * 1.0 / length(dir)
perp =垂直于方向=向量(dir.x,-dir.y)
nperp =标准化垂直= perp * 1.0 /长度(perp)

perpoffset = nperp * w * 0.5
diroffset = ndir * w * 0.5

(您可以轻松删除一个归一化并通过从另一个垂直方向计算其中一个偏移量)

p0,p1,p2,p3 =多边形点:
p0 = start + perpoffset - diroffset
p1 = start - perpoffset - diroffset
p2 = end + perpoffset + diroffset
p3 = end - perpoffset + diroffset

P.S。你是我要解释这个东西的最后一个人。 应该直观地理解这些事情。

答案 1 :(得分:1)

使用直线的方法是找到与原始线垂直(N)的线,在该方向上取5个像素的步长,然后在该点找到垂直线的垂线

  |     |
--+-----+---N
  |     |
  |     |

使用非直线进行此操作的方法是使用许多直线近似它,或者如果您有线的分析表示,则以与直线相似的方式找到某种解析解

答案 2 :(得分:1)

尝试这个未经测试的伪代码:

# Calculate the "Rise" and "run" (slope) of your input line, then 
# call this function, which returns offsets of x- and y-intercept
# for the parallel line.  Obviously the slope of the parallel line
# is already known: rise/run.

# returns (delta_x, delta_y) to be added to intercepts.  
adjacent_parallel(rise, run, distance, other_side):
    negate = other_side ? -1 : 1
    if rise == 0:
        # horizontal line; parallel is vertically away
        return (0, negate * distance)
    elif run == 0:
        # vertical line; parallel is horizontally away
        return (negate * distance, 0)
    else:
        # a perpendicular radius is - run / rise slope with length
        # run^2 + rize^2 = length  ^ 2
        nrml = sqrt(run*run + rise*rise)
        return (negate * -1 * run / nrml, negate * rise/nrml)

正如SigTerm在他漂亮的图表中所示,您将希望获得预期线两侧的线:所以传递thickness/2距离并调用两次,一次使用other_side=true,并绘制以“抽象线”为中心的厚度。

答案 3 :(得分:0)

你需要有一些数学背景。

首先理解line(线性方程和线性函数)什么是parallel,并从查找几何transformations中获益。

之后你会理解SigTerm的答案......