Algorytm rysowania okręgu/koła

Algorytm rysowania okręgu/koła
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 679
0

szukam algorytmu rysowania punktu przy czym podaje się jego promień , jak jest promień 1 to wiadomo że proste ale jak jest np 3 piksele promień czyli 6 pikseli na średnice to diabeł wie jak to oszacować...

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 539
3

Z równania okręgu to zrób

https://www.matemaks.pl/rownanie-okregu.html

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 679
0

pięknie tylko ja nie jestem pitagorasem 😀

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 539
0

Sprawdzasz każdy punkt czy spełnia rownanie

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 679
0

pisze przecież nie poradzę sobie z tym sam, ja z matmy w gimnazjum miałem czwórki na koniec roku bo nauczyciel świetnie wykładał, jak ja to mam sprawdzić, w pętli?

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 539
2

Jak ja mam Ci to wyjaśnić skoro nie potrafisz zrobić pętli dla x i pętli dla y i wstawić ifa z rownaniem? Nie jestem teraz przy komputerze więc kodu nie napiszę za Ciebie

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 679
0

jak będziesz przy kompie daj znać, będę wdzięczny 😀 jak chcesz to napisz kod dla mnie tym lepiej...
EDIT: myślałem też że by namalować koło przez sinusa i cosinusa od jednego piksela promieniem i po każdym zaokrągleniu zwiększać promień i na nowo rysowac koło z zwiększonym promieniem o jeden

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 539
1
Kopiuj
int srodek_okregu_x;
int srodek_okregu_y;
int promien;

for(int y=srodek_okregu_y-promien;y<srodek_okregu_y+promien;y+=1){
	for(int x=srodek_okregu_x-promien;x<srodek_okregu_x+promien;x+=1){
		if(pow(srodek_okregu_x-x,2)+pow(srodek_okregu_y-y,2)<pow(promien,2))
			rysuj_punkt(x,y);
	}
}
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 679
0

pow oznacza potęgę z tego co pamiętam ? pow ?
sorry juz mam https://cpp0x.pl/dokumentacja/standard-C/pow/34 muszę ręcznie dopisać tą funkcje, pow jest na VC++ 6.0 i działa ...

były błędy dwukropek zamiast średników ale już działa, dzięki Ci 😀

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 539
0

Sorry za ten błąd, piszę z telefonu. Ważne że działa

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 679
0

zrobiłem alhpa test:

Kopiuj
void PointXY(int srodek_okregu_x,int srodek_okregu_y,int promien)
{

unsigned char redUC_BD=rt;
unsigned char greenUC_BD=gt;
unsigned char blueUC_BD=bt;

	for(int y=srodek_okregu_y-promien;y<srodek_okregu_y+promien;y+=1){
		for(int x=srodek_okregu_x-promien;x<srodek_okregu_x+promien;x+=1){
		if(pow(srodek_okregu_x-x,2)+pow(srodek_okregu_y-y,2)<pow(promien,2))
			if(alphablend!=modeB)
			PutPixelT(x,y);
			else
			{
				unsigned char redUC_DB;//=drawbuffor[indexB];
				unsigned char greenUC_DB;//=drawbuffor[indexB+1];
				unsigned char blueUC_DB;//=drawbuffor[indexB+2];

				GetPixel(x,y,redUC_DB,greenUC_DB,blueUC_DB);
				float r1,g1,b1;
				r1=float(redUC_DB)/255;
				g1=float(greenUC_DB)/255;
				b1=float(blueUC_DB)/255;

				float r_out,g_out,b_out;
			

				float r2,g2,b2;
				r2=float(redUC_BD)/255;
				g2=float(greenUC_BD)/255;
				b2=float(blueUC_BD)/255;

				r_out=alphatest*r1 + (1 - alphatest)*r2;
				g_out=alphatest*g1 + (1 - alphatest)*g2;
				b_out=alphatest*b1 + (1 - alphatest)*b2;

				unsigned char rW=r_out*255;
				unsigned char gW=g_out*255;
				unsigned char bW=b_out*255;
				Color3iT(rW,gW,bW);
				PutPixelT(x,y);
			}
		}
	}

}
Kopiuj
draw.AlphaBlend(modeB);
draw.AlphaTest(0.75);
draw.Color3iT(255,255,255);
draw.PointXY(128,128,50);
draw.AlphaBlend(modeNone);

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9016
11

szukam algorytmu rysowania punktu przy czym podaje się jego promień

Tak od strony formalnej - jeśli mówimy o promieniu to już nie jest punkt, tylko okrąg albo koło 😛

A tak poza tym - bardzo nie podoba mi się Twoje podejście do tematu - zamiast poszukać (albo skorzystać z GPT, który na 99% ogarnie temat w 5 sekund) to piszesz z postawą roszczeniową - pisze przecież nie poradzę sobie z tym sam czy jak chcesz to napisz kod dla mnie tym lepiej....

JB
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Holandia
  • Postów: 853
0
wilkwielki napisał(a):

szukam algorytmu rysowania punktu przy czym podaje się jego promień , jak jest promień 1 to wiadomo że proste ale jak jest np 3 piksele promień czyli 6 pikseli na średnice to diabeł wie jak to oszacować...

A to nie chodzi o PI ?masz 4 przejścia,jeśli zmieniasz jedną wartość na + a jedną na - to wyjdzie Ci idalny skos. Ten parametr wraz ze zmianą powinien się zmniejszać. Dynamiczna zmiana wartości na + i -. Np. na osi X zmieniasz wartość o 1 w pierwszym przejściu, w drugim o 0.99 , w trzecim o 0.98 itp. aż do 0 potem zwiększasz coraz bardziej.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
2

https://en.wikipedia.org/wiki/Midpoint_circle_algorithm
https://godbolt.org/z/c7dPTPW3M

Kopiuj
class Canvas {
public:
    Canvas(size_t w, size_t h)
        : m(h, std::string(w, ' '))
    {
    }

    void point(size_t x, size_t y, char ch = '*')
    {
        m[y][x] = ch;
    }

    // Midpoint Circle Drawing Algorithm
    void drawCircle(int xc, int yc, int r, char ch = '*')
    {
        int x = 0;
        int y = r;
        int d = 1 - r;

        drawCirclePoints(xc, yc, x, y, ch);

        while (x < y) {
            x++;
            if (d < 0) {
                d += 2 * x + 1;
            } else {
                y--;
                d += 2 * (x - y) + 1;
            }
            drawCirclePoints(xc, yc, x, y, ch);
        }
    }

    std::ostream& writeTo(std::ostream& out) const {
        for (const auto& r : m) {
            out << r << '\n';
        }
        return out;
    }

private:
    void drawCirclePoints(int xc, int yc, int x, int y, char ch = '*')
    {
        point(xc + x, yc + y, ch);
        point(xc - x, yc + y, ch);
        point(xc + x, yc - y, ch);
        point(xc - x, yc - y, ch);
        point(xc + y, yc + x, ch);
        point(xc - y, yc + x, ch);
        point(xc + y, yc - x, ch);
        point(xc - y, yc - x, ch);
    }

private:
    std::vector<std::string> m;
};

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.