2014-01-20 586 views
0

我从另一个程序试图输入一些已知的ACR值,并复制它们在three.js所如何绘制2D弧

现在我用下面的代码我在此网站上发现。它画出的弧线很好,但它可能不是最好的选择。

function DRAWarc(){ 
      // smooth my curve over this many points 
      var numPoints = 100; 

      spline = new THREE.SplineCurve3([ 
       new THREE.Vector3(0, 0, 0), 
       new THREE.Vector3(0, 200, 0), 
       new THREE.Vector3(150, 150, 0) 
      ]); 

      var material = new THREE.LineBasicMaterial({ 
       color: 0xff00f0, 
      }); 

      var geometry = new THREE.Geometry(); 
      var splinePoints = spline.getPoints(numPoints); 

      for(var i = 0; i < splinePoints.length; i++){ 
       geometry.vertices.push(splinePoints[i]); 
      } 

      var line = new THREE.Line(geometry, material); 
      scene.add(line); 

     } 

以下是已知的变量。

中心点(X,Y)(如果都得一个完整的圆圈,圆圈的中心)
半径(如果它是一个圆)
起始角(我还不能肯定,但我认为这是度数,如果它是一个圆,逆时针旋转,0表示圆的右侧)
结束角(见上)

更多代码!

  /////////// 
    // SCENE // 
    /////////// 
    scene = new THREE.Scene(); 

    //////////// 
    // CAMERA // 
    //////////// 

    var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight; 

    viewsize = 900; 
    camera = new THREE.OrthographicCamera(
     SCREEN_WIDTH/- 2, SCREEN_WIDTH/2, 
     SCREEN_HEIGHT/2, SCREEN_HEIGHT/- 2, 
     1, 1e6); 
camera.position.z = 2000; 

    scene.add(camera); 


    camera.lookAt(new THREE.Vector3(2100, 3600, 0)); 

    ////////////// 
    // RENDERER // 
    ////////////// 

    // create and start the renderer 
    if (Detector.webgl){ 
     renderer = new THREE.WebGLRenderer(); 
     //alert('no problem.'); 
    }else{ 
     renderer = new THREE.CanvasRenderer(); 
     alert('problem.'); 
    } 
    renderer.setClearColor("white", 1); 
    renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT); 


    container = document.body; 

    container.appendChild(renderer.domElement); 

    //////////// 
    // EVENTS // 
    //////////// 

    // automatically resize renderer 
    THREEx.WindowResize(renderer, camera); 
    // toggle full-screen on given key press 
    THREEx.FullScreen.bindKey({ charCode : 'm'.charCodeAt(0) }); 

    /////////// 
    // STATS // 
    /////////// 

    // displays current and past frames per second attained by scene 
    stats = new Stats(); 
    stats.domElement.style.position = 'absolute'; 
    stats.domElement.style.bottom = '0px'; 
    stats.domElement.style.zIndex = 100; 
    container.appendChild(stats.domElement); 

    /////////// 
    // LIGHT // 
    /////////// 

    // create a light 
    var light = new THREE.PointLight(0xffffff); 
    light.position.set(0,250,0); 
    scene.add(light); 
    var ambientLight = new THREE.AmbientLight(0x111111); 
    // scene.add(ambientLight); 

    ////////////// 
    // GEOMETRY // 
    ////////////// 

    // most objects displayed are a "mesh": 
    // a collection of points ("geometry") and 
    // a set of surface parameters ("material") 

    doWork(); 


} 
function animate() 
{ 
    requestAnimationFrame(animate); 
    render();  
    update(); 
} 

function update() 
{ 
    // delta = change in time since last call (in seconds) 
    var delta = clock.getDelta(); 

    // functionality provided by THREEx.KeyboardState.js 
    if (keyboard.pressed("1")) 
     document.getElementById('message').innerHTML = ' Have a nice day! - 1'; 
    if (keyboard.pressed("2")) 
     document.getElementById('message').innerHTML = ' Have a nice day! - 2 ';  

    //controls.update(); 
    stats.update(); 
} 

function render() 
{     
    renderer.render(scene, camera); 
}` 
+0

我们可以看一下你的代码的其余部分,好吗?也许作为一个jsFiddle? – jameslafferty

+0

哥们我有28000行代码:P你想看什么?思考过后,这基本上是一个数学问题......我需要一种算法将数据转换为三点,然后上面的代码才能满足我的需求。顺便说一句,代码是好的只是想显示我正在尝试 – contehhh

+0

28千行可能是矫枉过正。我只是在寻找一个能够充分说明你想要做什么的例子。例如,我不知道'''scene''是从哪里来的,或者是否让''''''''''''''''''''''''全局有什么意义。根据你在这里得到的结果,很难完全回答这个问题。 – jameslafferty

回答

1

可以绘制弧圈几何

// compute angle between p1 and p2 
var angle = Math.acos(p1.dot(p2)/(p1.length()*p2.length())); 
// create arc 
var geometry = new THREE.CircleGeometry(radius, nbSegments, 0, angle); 
// remove center vertex 
geometry.vertices.splice(0,1); 
// TODO: move the arc to the good place in the scene 
// add arc to the scene 
scene.add(new THREE.Line(geometry, new THREE.LineBasicMaterial({ color: 0xff00f0 })); 
+0

帅哥!即时通讯不在目前的代码,但我一直到凌晨5点工作在这个迂回的方法大声笑......也有问题的某些弧线 – contehhh

+0

你知道一个方法来绘制一个弧给定的端点x/y和半径? – contehhh

+0

您可以计算x轴和x点之间的startAngle,如下所示:var startAngle = Math.acos(p0.dot(p1)/(p0.length()* p1.length()));其中p0.X = p1.X和p0.Y = 0。然后创建几何:var geometry = new THREE.CircleGeometry(radius,nbSegments,startAngle,angle); – Troopers

0

因此,经过一些研究,我发现了以下文章。

How do I calculate a point on a circle’s circumference?

这使我这个位数学的,可以适用于任何语言:

x = cx + r * cos(a) 
y = cy + r * sin(a) 

其中r为半径,CX,CY的起源,以及从0角度.2π弧度或0..360度。

和继承人一些有趣的阅读材料!
http://en.wikipedia.org/wiki/Circle#Equations

编辑:刚完成这个项目的草稿。 enjoi!

我没有绘制样条曲线,而是绘制了102点的曲线。弧的起点,终点,以及100个均匀间隔的点。它运作良好,并且如果需要,我会在行数中添加一个变量以减少内存。

function getARC(x, y, r, a){ 
    a = a * (Math.PI/180); 
    var ax = +x + +r * Math.cos(+a), 
     ay = +y + +r * Math.sin(+a), 
     res = []; 
     res['x'] = ax, 
     res['y'] = ay; 

    return res; 
} 
function DRAWarc(cx, cy, ra, sa, ea){ 
      var cx = '2473.5737'; 
      var cy = '3145.1300'; 
      var ra = '47.5538'; 
      var sa = '2'; 
      var ea = '91'; 

      var material = new THREE.LineBasicMaterial({ 
       color: 0xff00f0, 
      }); 

      var geometry = new THREE.Geometry(); 

       var s = getARC(cx, cy, ra, sa); 
       geometry.vertices.push(new THREE.Vector3(s['x'], s['y'], 0)); 

       var step = (ea - sa)/100; 

       for(var i=1;i<=100;i++){ 
        var t = getARC(cx, cy, ra, (+sa + (+step * +i))); 
        geometry.vertices.push(new THREE.Vector3(t['x'], t['y'], 0)); 
        //alert((+sa + (+step * +i))); 
       } 

       var f = getARC(cx, cy, ra, ea); 
       geometry.vertices.push(new THREE.Vector3(f['x'], f['y'], 0)); 

      var line = new THREE.Line(geometry, material); 
      scene.add(line); 

     }