C++ Circle in a grid

0

Cześć. Jeszcze nie potrafię pisać po polsku bez błędów gramatycznych, więc napiszę większość zadania po angielsku. Ale możecie odpowiadać po polsku - rozumiem niemal zupełnie wszystko bez szukania w słowniku. :)

I am a beginner in programming and I got stuck. I will be grateful for any help (hint, webpage, anything). I need to plot a circle using parametric equations in a grid of ARBITRARY size of squares. Then I need to check where every point of the circle is (in which square). If a square has a common edge with the previous one (orange squares in my case), I need to plot the bottom left point of an orange square (in my case blue points) and connect these points (pink lines). In the end, I need to find an area of the pink shape.

Coś mi się już udało napisać, tylko że nie wiem, jak zrobić tą sieć w taki sposób, że będę wiedziała, w którym kwadraciku się znajduję jakikolwiek punkt z okręgu. Może coś takiego jak "dynamic array"? Potem mogłabym sprawdzić sąsiadów [x][y] tak, że sprawdze [x-1][y], [x+1][y], [x][y-1] i [x][y+1]. Albo coś zupełnie innego? Napr. narysować linie (czyli 2x for loop)? Naprawdę nie wiem....

Dziękuję za jakąkolwiek pomóc.
262585462_194829402808669_2497186568023118829_n.jpg

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
	double angle, sx, sy, r;
	float x, y;
	float pi = 3.14159;

	cout << "Write an x coordinate of centre of a cicle: ";
	cin >> sx;
	cout << "Write a y coordinate of centre of a cicle: ";
	cin >> sy;
	cout << "Write a radius a cicle: ";
	cin >> r;

	cout << "write the angle: ";
	cin >> angle;
	double steps = 360 / angle;
	cout << steps;

	for (int i = 0; i < steps; i += angle)
	{
		x = sx + r * cos(angle);
		y = sy + r * sin(angle);		
	}
	return 0;
};
2

Correct me if I’m wrong, but it seems to me that you simply need to rasterize the circle.
Have you seen the midpoint circle algorithm? I’m no expert in graphics, but it seems a good starting point.
@GutekSan I guess you could recommend sth better here?

1

Ten problem chyba faktycznie nie jest do końca symetryczny (ze względu na ten "lewy dolny róg") żeby można było użyć symetrycznego algorytmu.
No to chyba trzeba po prostu zacząć jak w Brensehamie, ale nie wykorzystywać symetrii, tylko jechać dalej, zmieniając jedynie kryteria co jakiś czas.

Brakuje ci zmiennej określającej rozmiar kwadratu np: a. I chyba nie powinnaś iść w pętli for bo step nie powinien być określany przez użytkownika, bo jak będzie za rzadki względem promienia, to okrąg wyjdzie dziurawy. Zamiast tego należałoby chyba sprawdzać czy sąsiednie piksele spełniają warunek, że przecina je okrąg.

Sąsiednie piksele, które trzeba sprawdzić są zawsze tylko 2, bo interesują nas te, które się stykają krawędzią, tylko że w zależności od ćwiartki są to inne 2.

Tutaj taki pseudo kod

int x,y; // integer indices

x = floor((sx + r) / a);
y = floor(sy / a);

int xn_1, yn_1, xn_2, yn_2;
// valid for 1st quadrant only:
xn_1 = x + 0;
yn_1 = y + 1;

xn_2 = x - 1;
yn_2 = y + 0;
// for the 2nd quadrant yn_1 = y; yn_2 = y-1; Figure out for others 

if(crosses_circle(xn_1, yn_1, r)) {
   x = xn_1;
   y = yn_1;
}
else {
  x = xn_2;
  y = yn_2;
}
plot(x,y);

0

Brakuje danych - odzwierciedlenie ilości pikseli na wartość promienia.
Poza tym nie zbyt jasne zadanie, czy masz umieć sprawdzić czy podany punkt należy do obwodu, czy raczej narysować ten obwód?

1 użytkowników online, w tym zalogowanych: 0, gości: 1