Na początku przepraszam za błędy gramatyczne - nie jestem z Polski (jestem samoukiem).
Mój problem polega na tym, że t się zmniejsza, chociaż jego wartość powinna się zwiększać (co powoduje to, że program nie skończy). Dlatego mam w programie
cout << t << endl;
cin.get();
O co chodzi w moim programie:
1. punkt okręgu
znajdę go dzięki równaniu parametrycznemu (dla t=0), znajdę sobie lewy dolny punkt tego pixla, gdzie się to znajduje, czyli bottom_x_0 , bottom_y_0 i wynik sobie zapisze do digitalized_x[0] i digitalized_y[0].
Dla reszty punktów:
- Pierwszy punkt (dla t=0) już mam, wiec "for" się rozpoczyna od 2. punktu (t= 0+dt) i kończy się na "końcu" okręgu, czyli dla t=2*pi. Obliczę sobie kolejne x oraz y, znajdę lewy dolny punkt pixla i teraz:
- jeśli wynik x, y jest ten sam co poprzedni, to muszę zwiększyć dt i znów obliczyć nowe x,y (chcę mieć tylko różne punkty, nie te same) dla to same "k"
- jeśli wynik x, y nie jest ten sam co poprzedni, ale nowy pixel nie ma wspólną krawędź z poprzednim, to muszę zmniejszyć dt i znów obliczyć nowe x,y (dt było za duże) dla to same "k"
- jeśli wynik x, y nie jest ten sam co poprzedni i nowy pixel ma wspólną krawędź, to znalazłam nowy punkt i zapiszę sobie go do digitalized_x[k], digitalized_y[k] (najpierw muszę zwiększyć rozmiar tego wektora i tak sobie zapisać wynik) no i też zwiększę sobie "k" dla nowe wyniki.
Wszystko robię póki 1. punkt w digitalized_x, digitalized_y nie jest ten sam co ostatni obliczony (dlatego while).
No i na koniec chcę sobie wypisać całe digitalized_x, digitalized_y.
Czy ktoś widzi, na czym polega mój problem?
#define _USE_MATH_DEFINES
#include<iostream>
#include<math.h>
#include<vector>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
double sx = 2;
double sy = 2;
double r = 10;
double d = 2;
double dt = 2 * M_PI / 300;
double x, y;
double bottom_x_0, bottom_y_0, bottom_x, bottom_y;
vector<double> digitalized_x(2);
vector<double> digitalized_y(2);
//1.point
x = sx + r * cos(0);
y = sy + r * sin(0);
bottom_x_0 = floor(x / d) * d;
bottom_y_0 = floor(y / d) * d;
digitalized_x[0] = bottom_x_0;
digitalized_y[0] = bottom_y_0;
int k = 1;
//the rest
while ((digitalized_x[0] != digitalized_x[k]) && (digitalized_y[0] != digitalized_y[k]))
{
for (double t = dt; t <= (2 * M_PI); t += dt)
{
cout << t << endl;
cin.get();
x = sx + r * cos(t);
y = sy + r * sin(t);
bottom_x = floor(x / d) * d;
bottom_y = floor(y / d) * d;
if ((bottom_x == digitalized_x[k]) && (bottom_y == digitalized_y[k])) // the same value
{
dt *= 2;
break; // leaves the loop (if)
}
else if ( (digitalized_x[k] != ((bottom_x +d) || (bottom_x - d)) ) && (digitalized_y[k] != ((bottom_y + d) || (bottom_y - d)))) // different, but they do not have common edge
{
dt /= 3;
break; // leaves the loop (if)
}
else
{
digitalized_x.push_back(1); //new value in the vector, so we increase the size of it
digitalized_y.push_back(1); //new value in the vector, so we increase the size of it
digitalized_x[k] = bottom_x;
digitalized_y[k] = bottom_y;
k++;
continue; //jumps back to the beginning of the loop (including the update in case of a for - loop).
}
}
}
for (int i = 0; i < digitalized_x.size(); i++)
{
cout << "(" << digitalized_x[i]<< "," << digitalized_y[i] << ")" << endl;
}
}