如何在MATLAB中找到一个角度的平分线

时间:2010-10-13 08:13:23

标签: matlab computational-geometry

我有一个与此代码相关的问题:

t = -20:0.1:20; 
plot3(zeros(size(t)),t,-t.^2);
grid on
hold on
i = 1;
h = plot3([0 0],[0 t(i)],[0 -t(i)^2],'r');
h1 = plot3([-1 0],[0 0],[-400 -200],'g');
for(i=2:length(t))
    set(h,'xdata',[-1 0],'ydata',[0 t(i)],'zdata',[-400 -t(i)^2]);    
    pause(0.01);
end

在此代码中,我绘制了两条相交的线条。 H1和H2。 H1是固定的,H2随时间移动。在这个例子中,H2恰好跟踪抛物线,但它的运动可能是任意的。

如何为H2线的每个位置计算并绘制这两条相交线之间角度的平分线?我想在图中看到平分线和H2线同时移动。

对于H2的一个位置解决这个问题就足够了,因为对于H2的所有方向,它将与H1相同。

3 个答案:

答案 0 :(得分:1)

我不是几何天才,有可能更简单的方法来做到这一点。截至目前,没有人做出回应,所以这将是一件事。

你在三个空间中有三个点: 设A是两个线段的共同顶点 设B和C是两个线段上的两个已知点。

选择任意距离r

r< =从A到B的距离

r< =从A到C的距离

从A沿线段AB测量距离r。这是点RB 从A沿线段AC测量距离或r。这是RC点

找到连接RB和RC的线段的中点。这是M

线段AM是角度CAB的角平分线。


这些步骤中的每一步都应该相对容易实现。

答案 1 :(得分:1)

这里基本上是MatlabDoug的方法,在确定他称之为M的点上有一些改进。

t = -20:0.1:20;
plot3(zeros(size(t)),t,-t.^2);
grid on
hold on

v1 = [1 0 200];
v1 = v1/norm(v1);

i = 1;

h = plot3([-1 0],[0 t(i)],[-400 -t(i)^2],'r');
h1 = plot3([-1 0],[0 0],[-400 -200],'g');

l = norm([1 t(i) -t(i)^2+400]);
p = l*v1 + [-1 0 -400];
v2 = (p + [0 t(i) -t(i)^2])/2 - [-1 0 -400];
p2 = [-1 0 -400] + v2/v2(1);
h2 = plot3([-1 p2(1)],[0 p2(2)],[-400 p2(3)],'m');

pause(0.1)

for(i=2:length(t))
    l = norm([1 t(i) -t(i)^2+400]);
    p = l*v1 + [-1 0 -400];
    v2 = (p + [0 t(i) -t(i)^2])/2 - [-1 0 -400];
    p2 = [-1 0 -400] + v2/v2(1);

    set(h,'xdata',[-1 0],'ydata',[0 t(i)],'zdata',[-400 -t(i)^2]);
    set(h2,'xdata',[-1 p2(1)],'ydata',[0 p2(2)],'zdata',[-400 p2(3)]);

    pause;
end

答案 2 :(得分:1)

我只使用以下内容:

  1. 找到归一化向量AB和AC,其中A是线段的公共点。
  2. V =(AB + AC)* 0.5 //产生将AB和AC一分为二的方向矢量。

归一化V,然后执行A + V *长度以获取从公共点开始的所需长度的线段。

(请注意,此方法不能在沿直线的3个点上生成垂直平分线,在这种情况下,它将产生没有长度的向量)

我添加了一个C#实现(在XZ平面中使用Unity 3D Vector3结构),以处理垂直和等分线,以防万一认识MATLAB的人将其翻译。

    public Vector3 GetBisector(Vector3 center, Vector3 first, Vector3 second)
    {
        Vector3 firstDir = (first - center).normalized;
        Vector3 secondDir = (second - center).normalized;
        Vector3 result = ((firstDir + secondDir) * 0.5f).normalized;
        if (IsGreaterThan180(-firstDir, secondDir))
        {
            // make into a reflex vector
            (result.x, result.z) = (-result.x, -result.z);
        }
        if (result.sqrMagnitude < 0.99f)
        {
            // we have a colinear set of lines.
            // return the perpendicular bisector.
            result = Vector3.Cross(Vector3.up, -firstDir).normalized;
        }
        return result;
    }

    bool IsGreaterThan180(Vector3 dir, Vector3 dir2)
    {
        // < 0.0 for clockwise ordering
        return (dir2.x * dir.z - dir2.z * dir.x) < 0.0f;
    }

还要注意,返回的等分线是单位长度的向量。使用“中心+平分线*长度”可以将其放置到世界空间中。