(C ++) Зажим 2D-положения внутри круга (нарисован с использованием алгоритма окружности средней точки)

В настоящее время я рисую круги, используя алгоритм средней точки круга в моей программе C ++. Вот пример кода, который я использую.

void drawcircle(int x0, int y0, int radius)
{
int x = radius-1;
int y = 0;
int dx = 1;
int dy = 1;
int err = dx - (radius << 1);

while (x >= y)
{
putpixel(x0 + x, y0 + y);
putpixel(x0 + y, y0 + x);
putpixel(x0 - y, y0 + x);
putpixel(x0 - x, y0 + y);
putpixel(x0 - x, y0 - y);
putpixel(x0 - y, y0 - x);
putpixel(x0 + y, y0 - x);
putpixel(x0 + x, y0 - y);

if (err <= 0)
{
y++;
err += dy;
dy += 2;
}
if (err > 0)
{
x--;
dx += 2;
err += (-radius << 1) + dx;
}
}
}

Теперь мой вопрос, если я рисую такой круг drawcircle(100, 100, 100);Как я могу взять 2D-позицию и проверить, находится ли эта 2D-позиция внутри круга, а если нет, то вернуть «зажатую» 2D-позицию по краю круга.

Это должно помочь объяснить, что я пытаюсь сделать немного лучше.

void _2DPostionToCirclePosition(Vector2D in, Vector2D *out)
{
//assume in = Vector2D(800, 1100)
//here we somehow calculate if the in 2D
//position is within the circle we
//are drawing drawcircle(100, 100, 100).
//if the in 2D vector is within the circle
//just return in. but if it outside of the
//circle calculate and return a clamped position
//to the edge of the circle
(*out).x = calculatedOutX;
(*out).y = calculatedOutY;
}

1

Решение

Чтобы определить, находится ли точка в круге в первую очередь, вам необходимо рассчитать ее расстояние от центра круга, которое здесь у вас есть (100 100).
Что-то вроде этого :

#include <math.h> //for pow and sqrt

double getPointDistance(int x, int y) {
return sqrt (pow ((circleCenterX - x), 2.0) +
pow ((circleCenterY - y), 2.0));
}

Затем вы можете просто сравнить его с радиусом окружности, если расстояние больше радиуса, которое находится снаружи, если оно меньше, оно внутри и если оно равно, то оно прямо на краю. Для этого вы можете использовать что-то вроде этого:

bool isInCircle(int x, int y) {
if (circleRadius >= getPointDistance(x, y)) {
//it's inside the circle (we assumed on the edge is inside)
return true;
} else {
//given point is outside of the circle
return false;
}
}
1

Другие решения

Других решений пока нет …