|
저는 생각을 못했는데 사랑니 님이 말씀하신 내용을 찬찬히 읽다가 될거 같아서 아래처럼
구현했습니다.
현재 까지는 이상없이 잘 됩니다.
감사합니다.
답글 주신 다른분들도 모두 감사 드립니다.
void TfrmMain::Click_Point(double x, double y) // x, y 마우스로 클릭한 좌표
{
int dx, dy;
double d_ang1e1, d_angle2, d_dist;
dx = x;
dy = y;
// 원의 중심 좌표 (a, b), 반지름 r
if( dx >= a )
dx = dx - a;
else
dx = a - dx;
if( dy >= b )
dy = dy - b;
else
dy = b - dy;
// 마우스로 클릭한 점과 원 중심의 거리
d_dist = sqrt( pow(dx, 2.0) + pow(dy, 2.0) );
d_ang1e1 = acos( dx / d_dist );
d_angle2 = asin( dy / d_dist );
// radian을 degree 로 변환해주는 공식 (degree로 변환해줘야 정확한 각도 나옵니다.)
// ang1e1 와 ang1e2 같은 값이 나옵니다.
d_ang1e1 = d_ang1e1 / M_PI * 180.0;
d_angle2 = d_angle2 / M_PI * 180.0;
// 원을 중심에서 평행, 수직으로 해서 4 사분면으로 나누었을때
// 원 중심에서 우상, 좌상, 좌하, 우하 에 따라 아래처럼 해주면 정확한 각도 나옵니다.
// 원 중심에서 평행선을 그렸을때 오른쪽 선이 기준입니다.
if( (x < a) && (y < b) )
{
d_ang1e1 = 180 - d_ang1e1;
d_angle2 = 180 - d_angle2;
}
else if( (x < a) && (y > b) )
{
d_ang1e1 = 180 + d_ang1e1;
d_angle2 = 180 + d_angle2;
}
else if( (x > a) && (y > b) )
{
d_ang1e1 = 360 - d_ang1e1;
d_angle2 = 360 - d_angle2;
}
if( d_dist <= r)
{
if( (d_ang1e1 >= 0) && (d_ang1e1 < 60) ) // sector 2
// 처리
else if( (d_ang1e1 >= 60) && (d_ang1e1 < 120) ) // sector 1
// 처리
else if( (d_ang1e1 >= 120) && (d_ang1e1 < 180) ) // sector 6
// 처리
else if( (d_ang1e1 >= 180) && (d_ang1e1 < 240) ) // sector 5
// 처리
else if( (d_ang1e1 >= 240) && (d_ang1e1 < 300) ) // sector 4
// 처리
else if( (d_ang1e1 >= 300) && (d_ang1e1 < 360) ) // sector 3
// 처리
}
}
사랑니 님이 쓰신 글 :
: 부채꼴의 중심점 좌표는 아셨다고 하셨고,
:
: 먼저 부채꼴 아크쪽을 제외하고 삼각형의 내부좌표를 구분해두시구요, 삼각형에 포함되지 않은
: 아크쪽은 부채꼴의 각도범위 안에 마우스 XY좌표가 존재하고(&&) 반지름 내에 있는지 확인하면 되지않을까요..
:
: 좀 무식하지만..ㅎㅎ
:
|