java-如何围绕某个点旋转顶点?

想象一下,您在2d空间中有两个点,您需要将其中一个点旋转X度,另一个点作为中心。

float distX = Math.abs( centerX -point2X );

float distY = Math.abs( centerY -point2Y );

float dist = FloatMath.sqrt( distX*distX + distY*distY );

到目前为止,我只需要找到两点之间的距离...有什么想法我应该从那走?

6个解决方案

62 votes

最简单的方法是组成三个转换:

将点1引入原点的翻译

绕原点旋转所需角度

使点1返回其原始位置的翻译

当您全力以赴时,最终将进行以下转换:

newX = centerX + (point2x-centerX)*Math.cos(x) - (point2y-centerY)*Math.sin(x);

newY = centerY + (point2x-centerX)*Math.sin(x) + (point2y-centerY)*Math.cos(x);

注意,这假设角度x对于顺时针旋转为负(坐标系统的所谓标准方向或右手方向)。 如果不是这种情况,那么您需要根据涉及sin(x)的条款扭转符号。

Ted Hopp answered 2020-01-04T23:24:02Z

18 votes

您需要二维旋转矩阵[http://en.wikipedia.org/wiki/Rotation_matrix]

您的新观点是

newX = centerX + ( cosX * (point2X-centerX) + sinX * (point2Y -centerY))

newY = centerY + ( -sinX * (point2X-centerX) + cosX * (point2Y -centerY))

因为您是顺时针旋转,而不是逆时针旋转

mathematician1975 answered 2020-01-04T23:24:31Z

9 votes

假设您使用的是Java Graphics2D API,请尝试以下代码-

Point2D result = new Point2D.Double();

AffineTransform rotation = new AffineTransform();

double angleInRadians = (angle * Math.PI / 180);

rotation.rotate(angleInRadians, pivot.getX(), pivot.getY());

rotation.transform(point, result);

return result;

枢轴是您要旋转的点。

Slavcho answered 2020-01-04T23:24:55Z

2 votes

将“ 1”转换为0,0

旋转

x = sin(角度)* r;y = cos(角度)* r;

翻译回来

Tutankhamen answered 2020-01-04T23:25:28Z

0 votes

这是在2D中围绕任何其他点旋转任何点的方法。 请注意,在3D模式下,这可以用作绕z轴的旋转,因为不会改变点的z坐标,所以该点会被插入。 也可以轻松实现3D中围绕x轴和y轴的旋转。

该代码在JavaScript中。 开头的注释行是该功能的测试集。 它们还用作用法示例。

//A = new Array(0,0)

//S = new Array(-1,0)

//fi = 90

//alert("rotujBod: " + rotatePoint(A, S, fi))

function rotatePoint(A, S, fi) {

/** IN points A - rotated point, S - centre, fi - angle of rotation (rad)

* points in format [Ax, Ay, Az], angle fi (float)

* OUT point B

*/

r = Math.sqrt((A[0] - S[0])*(A[0] - S[0]) + (A[1] - S[1])*(A[1] - S[1]))

originOfRotation = new Array(S[0] + r, S[1])

if (A[1] < S[1]) {

A2 = new Array(A[0], -1*A[1])

originalAngle = -1*sizeOfAngle(originOfRotation, S, A2)

} else {

originalAngle = sizeOfAngle(originOfRotation, S, A)

}

x = S[0] + r*Math.cos(fi + originalAngle)

y = S[1] + r*Math.sin(fi + originalAngle)

B = new Array(x, y)

return(B)

}

function sizeOfAngle(A, S, B) {

ux = A[0] - S[0]

uy = A[1] - S[1]

vx = B[0] - S[0]

vy = B[1] - S[1]

if((Math.sqrt(ux*ux + uy*uy)*Math.sqrt(vx*vx + vy*vy)) == 0) {return 0}

return Math.acos((ux*vx + uy*vy)/(Math.sqrt(ux*ux + uy*uy)*Math.sqrt(vx*vx + vy*vy)))

}

Jan Kokes answered 2020-01-04T23:25:53Z

0 votes

这里是关心旋转方向的版本。 右(顺时针)为负,左(逆时针)为正。 您可以发送一个点或一个2d向量,并在此方法中设置其原语(最后一行),以避免为性能分配内存。 您可能需要将vector2和mathutils替换为您使用的库或Java的内置点类,并且可以使用math.toradians()代替mathutils。

/**

* rotates the point around a center and returns the new point

* @param cx x coordinate of the center

* @param cy y coordinate of the center

* @param angle in degrees (sign determines the direction + is counter-clockwise - is clockwise)

* @param px x coordinate of point to rotate

* @param py y coordinate of point to rotate

* */

public static Vector2 rotate_point(float cx,float cy,float angle,float px,float py){

float absangl=Math.abs(angle);

float s = MathUtils.sin(absangl * MathUtils.degreesToRadians);

float c = MathUtils.cos(absangl * MathUtils.degreesToRadians);

// translate point back to origin:

px -= cx;

py -= cy;

// rotate point

float xnew;

float ynew;

if (angle > 0) {

xnew = px * c - py * s;

ynew = px * s + py * c;

}

else {

xnew = px * c + py * s;

ynew = -px * s + py * c;

}

// translate point back:

px = xnew + cx;

py = ynew + cy;

return new Vector2(px, py);

}

请注意,这种方法比您在帖子中尝试的方法具有更高的性能。 因为您使用sqrt非常昂贵,所以如果您想知道的话,会以这种方式将度数转换为用查找表管理的弧度。 因此,它具有很高的性能。

ömer.bozkurt answered 2020-01-04T23:26:18Z

java 某点 旋转_java-如何围绕某个点旋转顶点?相关推荐

  1. java graphics旋转_Java图像之自定义角度旋转(实例)

    图像的旋转需要调用 graphics2d 类的rotate()方法,该方法将根据指定的弧度旋转图像. 语法如下: rotate(double theta) 其中, theta 是指旋转的弧度. 说明: ...

  2. java graphics2d旋转_JAVA用Graphics2D实现图片旋转,缩放,合成

    第一步:读入文件 public BufferedImage loadImageLocal(String path) { try { return ImageIO.read(new File(path) ...

  3. java图片镜像代码_java图片基本操作-缩放,旋转,镜像,拼接

    /*** 缩放*/ public static void zoomByScale(BufferedImage bufImage, double scale) throwsIOException {// ...

  4. java 图片旋转_Java实现图片内容无损任意角度旋转

    主要问题是如何在图片做旋转后计算出新图片的长宽. 在java 2d和基本math库的帮助下,其实利用简单的计算就可以知道. 以下算法只是计算出旋转小于90度时的公式.当旋转大于90时,可以先把问题域换 ...

  5. java多线程正在旋转的_一个正在高速旋转的巨大黑洞:速度竟达到光速的一半!...

    一个超大质量黑洞最近吞噬天体留下的残骸让科学家们能够计算出这个怪物黑洞的旋转速度,计算结果令人难以置信. 研究小组成员说,这个被称为ASASSN-14li的巨大黑洞正在以至少50%的光速旋转. &qu ...

  6. github java开源项目经验_Java 开源项目 GitHub 趋势周报 20201230

    [关注获取更多精选开源图书] 大家好!我是超级机器人 UltraBot,今天给大家推送本周 Java 开源项目 GitHub 趋势周报,本周更新开源项目 64. brettwooldridge / H ...

  7. html5 中心点旋转,html5 canvas围绕中心点旋转

    围绕中心点旋转 window.addEventListener('load',eventWindowLoaded,false); function eventWindowLoaded(){ canva ...

  8. 向量学习2:图形围绕自己中心旋转、围绕图形外或内任意点为中心旋转

    在前边博文"向量学习1"中,介绍了在篮球游戏中,防守者逼近防守投篮者,如何用向量,计算逼近的方向以及前进的距离.方法可用篮球投篮.足球射门和射击的子弹轨迹等等方面.在pygame游 ...

  9. 积分计算曲线围绕X轴旋转形成的立体体积

    积分计算曲线围绕X轴旋转形成的立体体积 若曲线y=x^2+1和直线y=-x+3围成的区域,再绕X坐标轴旋转一周,形成一个立体,计算该立体的体积. 如图: 先计算出所要求的在X坐标轴的积分上下限为[-2 ...

最新文章

  1. php购物车源码免费下载,php购物车源码
  2. android 显示单位 像素
  3. mysql 经验_mysql经验
  4. dede 文章列表页如何倒序排列
  5. CST光源控制卡简单操作C#程序
  6. wordpress WBOLT 百度推送管理 3.4.6 Pro
  7. Android 自定义ImageView加载图片
  8. activeperl安装不成功_SWOOLE进阶-00环境安装
  9. 计算机 专升硕,2020新西兰专升硕计算机专业可选院校有哪些?新西兰专升硕途径详解!...
  10. vuejs 和 element 搭建的一个后台管理界面
  11. 对称构型机器人轮直径校准思路
  12. 类构造函数(Constructor)单冒号:用法
  13. CentOS 5.6 使用光驱+系统光盘做YUM源
  14. php 差错,PHP 错误处理
  15. 三方支付 微信支付 支付宝支付 银联支付 分享
  16. 按120分计算成绩 mysql_mySql数据库基础
  17. 在线编辑Word——插入图片、图形
  18. 欧拉函数与积性函数(互质数)
  19. 什么是重载?重载的作用?
  20. AES加密算法和原理

热门文章

  1. java web 启动时执行_java Web 启动时自动执行代码的几种方式
  2. 各种initcall的执行先后顺序(module_init、postcore_initcall、arch_initcall、subsys_initcall、 fs_initcall)【转】...
  3. Bootstrap分页功能
  4. spring-102-spring全注解快速实现事务
  5. Java基础—集合2Set接口和Map接口
  6. [Linux学习笔记] Linux历史发展与应用
  7. Python函数的参数传递方式
  8. 用C实现的一个Bash脚本
  9. Fedora16 下更改多系统、多内核的默认启动项
  10. 视频大压缩的具体操作方法