通过鼠标移动沿圆形路径移动一个点(python / pygame)

时间:2017-02-11 19:17:55

标签: python rotation pygame geometry

问题:以鼠标输入为指导沿圆形路径移动一个点。

在线有很多解决方案可以沿着圆形路径移动一个点,即使用center + math.sin || cos(角度)* radius equation并递增角度。但是,这不适用于鼠标输入;即使在原始x / y值的一小部分,并转换为弧度,你的" circle"没有恒定的半径,路径点与鼠标的位置有奇怪的关系。

我的观察是路径点(圆周上的点)需要限制在离原点一定距离(强制半径)。我也觉得y需要是x或x的函数需要是y的函数。

我已经走上了使用距离公式来检查从路径点到圆心的距离。这个想法是为了那时候" snap" x和y值返回允许的距离 - 真正的距离但是...没有工作。也就是因为两点之间的距离和两点之间的差异(我如何开始理解它是两点之间的差异产生一个向量?) 。无论如何,我确信这是一个更直接的解决方案。

rotating arm guided by a mouse (为了说明起见,让...假装旋转臂居中)

2 个答案:

答案 0 :(得分:1)

不需要三角函数。 通过计算到中心的距离,你走在了一条很好的道路上。 想象一下从圆心到鼠标位置的矢量。 现在,重点必须放在同一个方向 作为这个向量,这意味着我们可以计算它的位置 用一个简单的scalar multiplication。唯一剩下的就是 计算标量,即比例 鼠标距离和圆半径之间:

package codeTest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class Main {

public static void main(String[] args) throws IOException {

    String filename = "sample.csv";


    try(Stream<String> stream = Files.lines(Paths.get(filename))){

        stream.forEach(System.out::println);


    try {

        File inputFile = new File("sample.csv");
        File outputFile = new File("Output.txt");

        BufferedReader reader = new BufferedReader(new FileReader(inputFile));
        BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));


        String strLine;
        java.util.ArrayList<String> list = new java.util.ArrayList<String>();

        while((strLine = reader.readLine()) != null){
            list.add(strLine);
        }

        System.out.println("\nTEST OUTPUT..........................\n");


        Stream<String> lineToRemove = list.stream().filter(x -> x.contains("yes"));



    } catch(Exception e){
        System.err.println("Error: " + e.getMessage());
    }
}
}
}

答案 1 :(得分:0)

你可以使用圆的x,y原点和鼠标的x,y位置来计算鼠标和圆之间的角度:tan((y_mouse-y_circle)/(x_mouse-x_circle))然后点的位置将是{ {1}}