gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:32:06 27 4
gpt4 key购买 nike

当椭圆不使用此公式1旋转时。如果value = 1-指向椭圆,如果value> 1-外部,如果value <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);
}
程序正确绘制了椭圆,但是错误地确定了点的位置。
工作示例:
3456
示例4和5与checkPointNoAngle方法一起正常工作。
我需要旋转椭圆,所以我创建了checkPoint方法。
示例6指出了一个错误。

最佳答案

代码有些混乱。我试图简化与旋转和反向旋转相对应的代码。以下代码似乎有效。

#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";
}

关于c++ - 椭圆(旋转)问题:检测到任何点的位置不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61867302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com