背景
部屋!我试图生成一块印有旧金山子集的电路板。大部分内容都已完成,我生成的图像看起来像这样:
问题在于我渲染的线条延伸到我的硬编码截止边界之外(我正在渲染一边是一边而一边是边界的线)。
问题:
给出一组这样的行:
# x1,y1, x2,y2
10,10,40,40
80,80,120,120
我如何修改每一行的坐标,以便它们切断'在一个特定的界限?
在上面的例子中,第二行(原始形式)延伸到(120,120),应该只延伸到(100,100),假定边界为100,100。
思想
基于我从高中数学中记得的东西,我应该在公式中插入一些东西y=mx+b
是吗?即便如此,我将如何处理无限的渐变等?
感谢任何和所有的帮助:D Puesdocode / python / Go首选,但解释就像慷慨接受。
< 3 汤姆
答案 0 :(得分:1)
你最好的朋友是Cohen-Sutherland线裁剪算法。
https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm
答案 1 :(得分:0)
坐下来解决它。我的基本方法是:
y=mx+b
来重新计算必要的坐标。这是我的Go代码:
func boundLine(line *kcgen.Line) {
if line.Start.X == line.End.X {
panic("infinite slope not yet supported")
}
slope := (line.End.Y - line.Start.Y) / (line.End.X - line.Start.X)
b := line.End.Y - (slope * line.End.X) //y = mx + b which is equivalent to b = y - mx
if line.Start.X < (-*width/2) {
line.Start.Y = (slope * (-*width/2)) + b
line.Start.X = -*width/2
}
if line.End.X < (-*width/2) {
line.End.Y = (slope * (-*width/2)) + b
line.End.X = -*width/2
}
if line.Start.X > (*width/2) {
line.Start.Y = (slope * (*width/2)) + b
line.Start.X = *width/2
}
if line.End.X > (*width/2) {
line.End.Y = (slope * (*width/2)) + b
line.End.X = *width/2
}
if line.Start.Y < (-*height/2) {
line.Start.Y = -*height/2
line.Start.X = ((-*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
}
if line.End.Y < (-*height/2) {
line.End.Y = -*height/2
line.End.X = ((-*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
}
if line.Start.Y > (*height/2) {
line.Start.Y = *height/2
line.Start.X = ((*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
}
if line.End.Y > (*height/2) {
line.End.Y = *height/2
line.End.X = ((*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
}
}