java - 根据规则求 vector 的长度

标签 java math vector trigonometry

我正在为具有给定点的网格创建顶点数组。到目前为止,我能够创建具有厚度的连续网格。但是,在两条线段的交点处存在问题,这些线段大小之间的 vector 需要是根据情况变大或变小,以便连续查看。

我现在拥有的:

What I have now

<小时/>

给定角度 theta1 和 theta2,如何计算红色 vector 的长度?

我想要什么: What I want

<小时/>

我如何构建网格: How I structured my mesh

最佳答案

您可能让它变得比需要的更复杂。

让我们从计算红色箭头开始。对于任何线段(p_i, p_j),我们可以计算线段的法线:

dir = normalize(p_j - p_i)
normal = (-dir.y, dir.x)  //negate if you want the other direction

在两个线段之间的连接点,我们可以对入射法线进行平均(并重新标准化)。这给了我们红色箭头。

剩下的唯一问题是您需要改变多少。给定顶点 o_v 的偏移量,线段 o_l 的最终偏移量为:

o_l = o_v * dot(normal_l, normal_v)

这意味着:两个法线都是单位 vector 。因此,它们的点积至多为一。这是两条线段平行时的情况。然后,将顶点的整个偏移量转移到线上。角度越小,传递的偏移量就越小。例如。如果两个连续线段之间的角度为 120°,则法线的点积为 0.5。如果将顶点沿其法线移动 1 个单位,则两条线段的厚度均为 0.5。

因此,为了产生特定的线条粗细 (o_l),我们需要将顶点移动 o_v:

o_v = o_l / dot(normal_l, normal_v)

将线段法线平均为顶点法线的构造可确保 dot(normal_l1,normal_v) = dot(normal_l2,normal_v),即两条线所得的线粗细相等无论如何。

关于java - 根据规则求 vector 的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32693516/

相关文章:

Java线程: synchronized reading and writing of value on the same object

.net - Math.Max 与 Enumerable.Max

math - SVG curveTo(C)如何工作?

math - 在整数环中使用 FFT 进行乘法

r - subset() 删除向量上的属性;如何维护/坚持它们?

r - 在R中,如果矩阵按行选择第一个元素,如果向量选择第一个元素

java - Mongodb 中的聚合

java - junit 和 psvm 有什么区别

java - 针对 Oracle 数据库的批处理 "UPDATE vs. INSERT"查询

c++ - 创建引用 vector 的优雅方式