gpt4 book ai didi

java - 根据规则求 vector 的长度

转载 作者:行者123 更新时间:2023-12-01 11:08:13 26 4
gpt4 key购买 nike

我正在为具有给定点的网格创建顶点数组。到目前为止,我能够创建具有厚度的连续网格。但是,在两条线段的交点处存在问题,这些线段大小之间的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com