Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 在Three.js中的两点之间绘制椭圆弧_Math_Three.js_Ellipse - Fatal编程技术网

Math 在Three.js中的两点之间绘制椭圆弧

Math 在Three.js中的两点之间绘制椭圆弧,math,three.js,ellipse,Math,Three.js,Ellipse,我一直试图在两个任意点之间绘制一条椭圆弧,但我的实现在某些情况下不起作用 因为这其中有一部分涉及到数学,所以我从提问开始。 基本上,给定两个点和中心,如果允许旋转,总是可以得到一个椭圆,但点共线的情况除外 对这一问题提出的解决办法是: 将中心平移到原点,将两个点平移到同一矢量 通过角度-alpha旋转两个点,该角度是最大向量与正x半轴的角度的simmetric 求解椭圆方程以找到其半径(由两个方程和两个未知数组成的系统) 定义椭圆 以角度alpha向后旋转椭圆,并平移回其中心 但是,我在Thre

我一直试图在两个任意点之间绘制一条椭圆弧,但我的实现在某些情况下不起作用

因为这其中有一部分涉及到数学,所以我从提问开始。 基本上,给定两个点和中心,如果允许旋转,总是可以得到一个椭圆,但点共线的情况除外

对这一问题提出的解决办法是:

  • 将中心平移到原点,将两个点平移到同一矢量
  • 通过角度
    -alpha
    旋转两个点,该角度是最大向量与正x半轴的角度的simmetric
  • 求解椭圆方程以找到其半径(由两个方程和两个未知数组成的系统)
  • 定义椭圆
  • 以角度
    alpha
    向后旋转椭圆,并平移回其中心
  • 但是,我在Three.js中实现这一点时遇到了困难。 的文档列出了预期参数。我假设起始角度始终为零,然后将结束角度设置为两个向量之间的角度或其simmetric。我还希望圆弧始终是最小的(即,如果角度大于180º,我将使用互补圆弧)。我假设椭圆的中心是形状边界框中心之间的中点

    这是我的示例代码:

    此示例尝试从原始形状中的顶点和修改形状中的相同顶点创建圆弧。
    关于椭圆弧的代码位于类EllipseArc下,您可以在第190行中处理应用于对象的变换

    它适用于某些情况:

    但并非全部:

    只是一个从头开始的想法,而不是最终的解决方案

    克隆和平移对象时,要在两个各自的点之间构建圆弧,需要它们在世界坐标系中的坐标,以及对象质心之间中点的坐标

  • 在世界空间中的点之间(起点和终点向量之间)找到中点
  • 找到它在平移向量上的投影(这是圆弧的中心)
  • 通过从每个向量减去结果中心向量,找到向量之间的角度
  • 将一个角度除以分割数-您将得到步长值
  • 获取结束向量作为基础,并在循环中围绕轴(即三角形的法线,由开始、中心和结束向量构建)旋转它,将该步长角度值乘以当前迭代次数
  • 代码示例:

    var scene=new THREE.scene();
    var摄像机=新的三视角摄像机(60,内宽/内高,11000);
    摄像机位置设置(0,0,150);
    var renderer=new THREE.WebGLRenderer();
    设置大小(innerWidth,innerHeight);
    document.body.appendChild(renderer.doElement);
    var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
    var shapeGeom=new THREE.ShapeBufferGeometry(new THREE.Shape(californiaPts));
    shapeGeom.center();
    形状基元比例(0.1,0.1,0.1);
    var shapeMat=新的三网格基本材质({
    颜色:“橙色”
    });
    var shape=新的三点网格(shapeGeom、shapeMat);
    shape.updateMatrixWorld();
    场景。添加(形状);
    var shapeClone=shape.clone();
    shapeClone.position.set(25,25,0);
    shapeClone.UpdateMatrix()文件;
    场景。添加(shapeClone);
    var center=new THREE.Vector3().lerpVectors(shapeClone.position,shape.position,0.5);
    var vecStart=new THREE.Vector3();
    var vecEnd=new THREE.Vector3();
    var pos=shapeGeom.getAttribute(“位置”);
    for(设i=0;i
    正文{
    溢出:隐藏;
    保证金:0;
    }
    
    变量californiaPts=[
    新三矢量2(610320),
    新的三个矢量2(450300),
    新的三个矢量2(392392),
    新的三个矢量2(266438),
    新的三个矢量2(190570),
    新的三个矢量2(190600),
    新的三个矢量2(160620),
    新的三个矢量2(160650),
    新的三个矢量2(180640),
    新的三个矢量2(165680),
    新的三个矢量2(150670),
    新的三个矢量2(90737),
    新的三个矢量2(80795),
    新的三个矢量2(50835),
    新的三个矢量2(64870),
    新的三个矢量2(60945),
    新三个矢量2(300945),
    新的三个矢量2(300743),
    新的三个矢量2(600473),
    新的三个矢量2(626425),
    新的三个矢量2(600370),
    新三个矢量2(610320)
    ];
    
    在坏情况下会发生什么?计算出错误的椭圆?正确的椭圆但错误的圆弧?我不会依赖
    EllipseCurve
    @prisoner849我不知道没有它该怎么办。相关?-非常感谢你的所有工作!我还没有测试过它,但在你的示例中它似乎工作得很好。我一直在尝试将你的代码融入我的e但我没有取得任何成功。我基本上已经在世界空间工作了