微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提高JS中的Trig计算精度

如何解决提高JS中的Trig计算精度

我有一个用于JS图形的代码,该图形应该绘制三个圆,并且无论它们的半径如何,其边缘都应始终接触。

import React,{ useState,useEffect } from "react";
import "./styles.css";

export default function App() {
  //circles[0] = r1
  //circles[1] = r2
  //circles[2] = r3

  const circles = [40,30,20];
  const colours = ["green","blue","red"];


  let circle2xPos =
    2 * Math.sqrt(circles[0] * circles[1]) + circles[0]; // What Dr E has

  let r1r2 = circles[0] + circles[1];
  let r1r3 = circles[0] + circles[2];
  let r2r3 = circles[1] + circles[2];
    
   let newAngle = Math.atan2(r1r2,r1r3)
  let ycoord = Math.cos(newAngle) * r1r3
  let xcoord = Math.sin(newAngle) * r1r2 + circles[0]

  const getCircleY = index => {
    let yPos = 0;
    if (index === 2) {
      yPos = h
    }
    return yPos;
  };

  const getCircleX = (index,x) => {
    let xPos = 0;

    console.log(circles);
    for (let i = 0; i < index + 1; i++) {
      console.log(circles[i]);
      if (i === 0) {
        xPos = circles[1];
      } else if (i === 1) {
        xPos = circle2xPos;
        console.log("xPos",xPos);
      } else if (i === 2) {
        xPos = xcoord + circles[0]
      }
    }
    return xPos;
  };

  const getCircles = () => {
    return circles.map((item,index) => (
      <div
        className="circle"
        style={{
          position: "absolute",top: getCircleY(index),left: getCircleX(index,getCircleY(index)),height: 2 * item,width: 2 * item,padding: 0,margin: 0,backgroundColor: colours[index],borderRadius: "50%"
        }}
      />
    ));
  };
  return (
    <div className="App">
      <div className="circles">{getCircles()}</div>
    </div>
  );
}

工作正常-前两个始终会碰触,但下一个圆圈有时只会在正确的位置结束。

我尝试了许多不同的方法来计算第三个圆的坐标,并且我总是设法找到特定值的解决方案,但是我似乎无法一概而论,因此它可以与任何数字一起使用吗?似乎不只是将cos或sin保持在1到-1之间,因此arc函数不会返回NaN,有时触发值似乎消失了,第三个圆在错误的位置。

对于第二个圆,理想的是从(x,y)=(r1,2r1 + r3)开始(半径直接与y轴成一条直线,因此圆2堆叠在圆1的死点上) ,然后绕圆1的中心旋转圆2,直到它碰到圆3的边缘-我该怎么做?

latest

解决方法

在您的圈子数组中,您有40,30,20。在这下面,您有r1r2 = circle [0] + circle [1],所以这些看起来是半径,对吗?

假设以上正确,解决此问题的正确方法是:

在原点(0,0)处的起点1(如果需要,可以稍后转换所有点),在x轴上的起点2(r1 + r2,0)

Pt3与Pt1的距离为r1 + r2,并且应该成角度atan(r2 + r1 / r3 + r1),或者只是atan2(r2 + r1,r3 + r1);

我认为应该可以

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。