根据坐标将时间定位在时钟上

时间:2015-04-25 12:47:09

标签: java python geometry

基于x和y坐标,我需要实现像

这样的函数
int getArea(double xcoord, double ycoord , double radius)

获得时间的粗略时间。粗糙时间表示全天时钟的时间。所以在这种情况下,1点,2点等...如果坐标在半径之外,函数应该返回-1。

或者更具图形性:想象一下第二部饥饿游戏电影/书。你有12个不同的区域,像时钟一样排序。然后在功能中输入贡品的坐标,以及竞技场的半径,作为回报,您希望获得当前贡献的区域。

所以我设法弄清楚如何检查位置是否在时钟上

if(Math.pow(x,2) + Math.pow(y,2) < Math.pow(radius,2))

另外,我有一个计算行业的小块:

int sectors = 12;
double angle = 2*Math.PI/sectors;
double x_sectors[] = new double[sectors];
double y_sectors[] = new double[sectors];
for(int i = 0; i<sectors; i++){
    x_sectors[i] = Math.cos(i*angle)*radius;
    y_sectors[i] = Math.sin(i*angle)*radius;
}

但我坚持使用一种方法来检查给定坐标是哪个扇区。

2 个答案:

答案 0 :(得分:0)

使用Math.atan2()if (Math.hypot(x, y) > radius) return -1; // out of the circle double theta = Math.atan2(x, y); if (theta < 0) theta += Math.PI * 2d; int sector = (int)(theta / Math.PI / 2d * 12d) + 1; // number of one of 12 sectors enumerated from 1 方法通过给定的x和y在极坐标中执行计算:

pylint --version

答案 1 :(得分:0)

我建议使用Math.atan2方法并改变其角度范围:

int getArea(double xcoord, double ycoord , double radius) {
    if(xcoord*xcoord + ycoord*ycoord > radius*radius)
        return -1;
    double angle = Math.PI/2 - Math.atan2(ycoord, xcoord); // Need to suptract the angle from Pi/2 because we want 0 rad to be at +y axis instead of +x axis
    if(angle < 0) // Math.atan2 gives angle in range -Pi/2 to Pi/2 so need to shift it to range 0 to 2*Pi
        angle = 2*Math.PI + angle;
    int segments = 12;
    double angle_one_segment = 2*Math.PI/segments;
    return 1 + (int)(angle/angle_one_segment); // From 12 o'clock to 1 o'clock it's first sector (exactly 12 belongs to 1st sector) and so on. If point (x, y) lies exactly at the boundary between 2 sectors it belongs to the higher one
}

See it run with some testcases on ideone.