如何计算曲线线的垂直偏移?

huangapple go评论94阅读模式
英文:

How to calculate curve line perpendicular offset?

问题

我有一组曲线线段的位置,这些位置对应于图像中的红色线条,
现在我需要计算出其余曲线线段的位置,这些位置对应于图像中的绿色线条。

我想要将所有线段组合成多边形以进行绘制,这与图像中的蓝色线条对应,我不能使用线段来实现它。因为我需要根据测量数据来渲染颜色。

现在我使用三角形来绘制蓝色线条。

我应该如何计算垂直曲线线段的偏移?

英文:

I have a set of positions of a curve line which red line of image,
Now I have to calculate positions of rest curve lines which green line of image.

I want to combine all lines as polygon for draw which the blue line of image, I can't use line with to do it. Because I need to render color by measure data.

Now I draw blue line with triangles.

How should I calculate perpendicular curve line offset?

如何计算曲线线的垂直偏移?
如何计算曲线线的垂直偏移?

答案1

得分: 1

这是局部投影到2D吗?

偏移一条线意味着只需将偏移添加到其端点。在2D中,垂直位移计算非常简单。您有线端点 P0,P1,想要线 Q0,Q1,它与 P0,P1 平行,距离为 l,所以:

dp = P1-P0                 // 线的方向向量
dp /= length(dp)           // 使其成为单位向量
dq =  vec2( +dp.y, -dp.x ) // 在2D中旋转90度,使dq垂直于dp
dq *= l                    // 偏移现在等于大小l
Q0 = P0 + dq
Q1 = P1 + dq

如果您正在处理曲线或多边形,则必须处理边缘,请参阅:

如果这是3D的话,您必须使用cross乘积来获取dq,并带有某个参考方向(比如地球表面的法线):

dq = cross (dp , some_refernce_direction_unit_vector)
dq *= l
英文:

so this is locally projected to 2D?

Offsetting a line means you just add offset to its endpoints. The perpendicular shift is computed in 2D very simply. You have line endpoints P0,P1 and want line Q0,Q1 which is parallel to P0,P1 at distance l so:

<!-- language: cpp -->

dp = P1-P0                 // line direction vector
dp /= length(dp)           // make it unit
dq =  vec2( +dp.y, -dp.x ) // rotate by 90 deg in 2D so dq is perpendicular to dp
dq *= l                    // offset is now equal to size l
Q0 = P0 + dq
Q1 = P1 + dq

now if you are doing curves or polygons you have to handle the edges see:

if this is 3D then you have to use cross product to get the dq along with some reference direction (like normal to earth surface)

dq = cross (dp , some_refernce_direction_unit_vector)
dq *= l

huangapple
  • 本文由 发表于 2023年6月22日 05:36:00
  • 转载请务必保留本文链接:https://go.coder-hub.com/76527308.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定