Wil*_*iam 0 java math polygon angle
好吧,我正在尝试基于角度为0. x的原始位置旋转Java多边形,并且y最终在使用它们时最终转换为int,所以我可以理解没有看到一些变化,但是当角度差异大到0到180我觉得我应该看到一些东西.
我已经在这一段时间了,不能想到它是什么.这是方法.(对不起,如果它在代码标签中混乱,我的Firefox会搞砸它们.)
public void rotate(double x, double y, obj o1)
{
double dist = Math.sqrt(Math.pow(x - (o1.x + (o1.w/2)), 2) + Math.pow(y - (o1.y + (o1.h/2)),2));
x += (Math.sin(Math.toRadians(o1.a)) * dist);
y -= (Math.cos(Math.toRadians(o1.a)) * dist);
}
Run Code Online (Sandbox Code Playgroud)
由于Java通过值传递方法参数,因此在调用它的方法中将看不到方法中正在操作的值x和y正在操作的值.rotate
因此,x和y那些在正在改变值rotate的方法是一个本地副本,所以一旦超出范围(即从返回rotate的方法来调用它的方法),值x和y消失.
所以目前正在发生的事情是:
x = 10;
y = 10;
o1 = new obj();
o1.a = 100;
rotate(x, y, obj);
System.out.println(x); // Still prints 10
System.out.println(y); // Still prints 10
Run Code Online (Sandbox Code Playgroud)
从Java中的方法获取多个值的唯一方法是传递一个对象,并操纵传入的对象.(实际上,在进行方法调用时会传入对象引用的副本.)
例如,重新定义rotate以返回Point:
public Point rotate(int x, int y, double angle)
{
// Do rotation.
return new Point(newX, newY);
}
public void callingMethod()
{
int x = 10;
int y = 10;
p = rotate(x, y, 45);
System.out.println(x); // Should print something other than 10.
System.out.println(y); // Should print something other than 10.
}
Run Code Online (Sandbox Code Playgroud)
也就是说,正如皮埃尔所说,在我看来,使用AffineTransform会更容易.
例如,创建Rectangle对象并使用它旋转AffineTransform可以通过以下方式执行:
Rectangle rect = new Rectangle(0, 0, 10, 10);
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(45));
Shape rotatedRect = at.createTransformedShape(rect);
Run Code Online (Sandbox Code Playgroud)
AffineTransform可以应用于实现Shape接口的类.Shape可以在Shape接口的链接Java API规范中找到实现类的列表.
有关如何使用AffineTransform和Java 2D的更多信息: