椭圆(旋转)的问题:检测到任何点的位置不正确。

问题描述 投票:1回答:1

当椭圆没有用这个公式旋转时 1. 如果值=1--椭圆上的点,如果值>1--外面,如果值<1--里面。程序工作正常.代码。

int checkPointNoAngle(int x0, int y0, int x, int y, int a, int b)
{
    int value = (pow((x - x0), 2) / pow(a, 2)) + (pow((y - y0), 2) / pow(b, 2));
    return value;
}

我需要处理一个旋转的椭圆,所以我使用了公式: 2.现在程序错误地确定了点的位置。

int checkPoint(int x0, int y0, int x, int y, int a, int b)
{
    int angle = 90;
    int value = (pow(cos(angle * M_PI / 180)*((x - x0)+sin(angle * M_PI / 180)*(y-y0)), 2) / pow(a, 2)) + (pow(sin(angle * M_PI / 180) * ((x - x0) - cos(angle * M_PI / 180) * (y - y0)), 2) / pow(b, 2));
    return value;
}

我用这段代码画了一个椭圆。

for (int t = 0; t < 360; t++)
{
    int x = a * cos(t);
    int y = b * sin(t);
    int x1 = x * cos(angle * M_PI / 180) + y * sin(angle * M_PI / 180);
    int y1 = -x * sin(angle * M_PI / 180) + y * cos(angle * M_PI / 180);
    SDL_RenderDrawPoint(ren, x1 + centerX, y1 + centerY);
}

程序正确地画出了椭圆,但错误地确定了点的位置。 工作实例。3,4,5,6.例4和5可以正确使用checkPointNoAngle方法.我需要旋转椭圆,所以我创建了checkPoint方法.例6表示一个错误。

c++ sdl-2
1个回答
0
投票

代码有点混乱。我试着简化旋转和反旋转对应的代码。下面的代码似乎可以工作。

#include    <iostream>
#include    <vector>
#include    <cmath>

struct Pt {int x, y;};

double checkPoint(int x0, int y0, int x, int y, int a, int b, int angle) {
    double ang = (angle * M_PI)/180;
    x = x - x0;
    y = y - y0;
    double xp = cos(ang)*x + sin(ang)*y;
    double yp = -sin(ang)*x + cos(ang)*y;
    double value = (xp*xp) / (a*a) + (yp*yp) / (b*b);
    return value;
}

std::vector<Pt> gene_ellipse (int centerX, int centerY, int angle, int a, int b) {
    std::vector<Pt> v;
    double c = cos (angle * M_PI/180);
    double s = sin (angle * M_PI/180);
    for (int t = 0; t < 360; t++) {
        double tt = M_PI * t / 180.0;
        double x = a * cos(tt);
        double y = b * sin(tt);
        int x1 = x * c - y * s;
        int y1 = x * s + y * c;
        v.push_back (Pt{x1 + centerX, y1 + centerY});
    }
    return v;
}

int main () {
    int centerX = 320;
    int centerY = 240;
    int angle = 120;        // in degrees
    int a = 200;
    int b = 100;

    int index = 25;

    auto v = gene_ellipse (centerX, centerY, angle, a, b);
    double check = checkPoint (centerX, centerY, v[index].x, v[index].y, a, b, angle);
    std::cout << "check = " << check << "\n";
}
© www.soinside.com 2019 - 2024. All rights reserved.