我们想使用sin& cos将镜像视图移动到两个弧形中,其形状就像NFL橄榄球的外围。我们不太优雅的代码如下。它可以工作但是当我们尝试使用sin和cos来解决这个动画时,第一个问题是坐标系认为点0,0是屏幕的左上角并移动图像视图并开始将其移出屏幕。我们试图通过各种方法来解决这个问题。我们知道开始和停止X和Y点,但不知道圆的半径。 问题一是如何将imageview放在正确的位置? 问题二是如何在顶部圆弧上移动图像视图,然后沿底部圆弧返回到起始位置。 我们在问题中使用了Android,因为这不是数学或JavaFX问题 请理解我们知道这是关于在Android中使用sin和cos实现它的数学。 此链接已关闭cos & sin use
这是我们的工作代码
public void startGAME(View view){
earth.setVisibility(View.VISIBLE);
earth.setX(60);
earth.setY(520);
// Create and Start the timer.
timer = new Timer();
handler = new Handler();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
orbitEARTH();
}
});
}
}, 0, 500);
}
public void orbitEARTH(){
if(earth.getX() == 828){
number = 2;
}
if(earth.getX() == 1884){
number = 3;
}
if(earth.getX() == 914){
number = 4;
}
if(earth.getX() == 41){
earth.setX(60);
earth.setY(520);
number = 1;
}
switch (number) {
case 1:
xPos = (int) (earth.getX()+96);
yPos = (int) (earth.getY()-30);
earth.setX(xPos);
earth.setY(yPos);
System.out.println("##### 1 xPos"+xPos+" yPos "+yPos);
break;
case 2:
xPos = (int) (earth.getX()+96);
yPos = (int) (earth.getY()+30);
earth.setX(xPos);
earth.setY(yPos);
System.out.println("##### 2 xPos"+xPos+" yPos "+yPos);
break;
case 3:
xPos = (int) (earth.getX()-97);
yPos = (int) (earth.getY()+30);
earth.setX(xPos);
earth.setY(yPos);
System.out.println("##### 3 xPos"+xPos+" yPos "+yPos);
break;
case 4:
xPos = (int) (earth.getX()-97);
yPos = (int) (earth.getY()-30);
earth.setX(xPos);
earth.setY(yPos);
System.out.println("##### 4 xPos"+xPos+" yPos "+yPos);
break;
}
}
答案 0 :(得分:1)
在所有现实中,我不确定你的代码是不是那么优雅。使用sin和cos来移动地球轨道需要更多的思考和工作。也就是说,如果任何人尝试这个代码,那么很多变量都是相互依赖的,那就不太理想了我要发布的内容。但它确实回答了这个问题 所以我建议按照这个链接来掌握主题
public void startGAME(View view){
earth.setVisibility(View.VISIBLE);
earth.setX(60);
earth.setY(520);
// Create and Start the timer.
timer = new Timer();
handler = new Handler();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
newORBIT();
}
});
}
}, 0, 500);
}
public void newORBIT(){
newTheta = newTheta + 0.009;
radius = 10;
newDeltaX = radius*Math.cos(newTheta);
newDeltaY = radius*Math.sin(newTheta);
earth.setRotation(ANGLE += 7.5f);
ANGLE = earth.getRotation();
System.out.println("############# Angle "+ANGLE);
if(ANGLE < 82.5) {
X = (float) newDeltaX + 60;
Y = (float) newDeltaY - 18.75f;
}
if(ANGLE > 82.5){
X = (float) newDeltaX + 60;
Y = (float) newDeltaY + 18.75f;
}
if(ANGLE > 196){
X = (float) newDeltaX - 60;
Y = (float) newDeltaY + 18.75f;
}
if(ANGLE > 330){
X = (float) newDeltaX - 60;
Y = (float) newDeltaY - 18.75f;
}
if(ANGLE > 457){
ANGLE = 0;
newTheta = 0;
newDeltaX = 0.0f;
newDeltaY = 0.0f;
X = 0;
Y = 0;
earth.setRotation(0);
earth.setX(60);
earth.setY(520);
}
earth.setX(earth.getX()+X);
earth.setY(earth.getY()+Y);
}