L
leech schrieb:
das hier wäre mein vorschlag eine gerade zu zeichnen in 2d...
einen kreis würde ich dann mit der kreisgleichung berechnen und malen...
//mit allegro realisiert...
void drawLine(int x1, int y1, int x2, int y2)
{
acquire_screen(); //zuerst die steigung berechnen...
float m = float((y2 - y1) / (x2 - x1)); //es wird nicht geprüft, ob x2 - x1 == 0 ist... sollte ja nur meinen überlegungsansatz zeigen...
float b = y1 - (m * x1); //dann den y-achsenabschnitt...
if(x1 < x2)
{
while(x1 < x2)
{
int x = x1 + 1; //der eine punkt nähert sich dem anderen...
int y = int(m * x + b); //den y- wert der x-koordinate berechnen...
putpixel(screen, x, y, makecol(255, 0, 0)); //den punkt anzeigen...
x1++;
}
}
else
{
while(x1 > x2)
{
int x = x1 - 1; //gleiches verfahren, nur anders herum...
int y = int(m * x + b);
putpixel(screen, x, y, makecol(255, 0, 0));
x1--;
}
}
release_screen();
}
ungetestet:
void drawLine(int startX, int startY, int endX, int endY)
{
acquire_screen();
for(float iteratorX = (abs(endY - startY) < abs(endX - startX))?((endX-startX<0)?-1:1):((float)(endX-startX)/(float)(abs(endY-startY))),iteratorY = (abs(endY - startY) < abs(endX - startX))?((float)(endY-startY)/(float)(abs(endX-startX))):((endY - startY < 0)?-1:1),iX = startX,iY = startY,aaX = abs(endY - startY) < abs(endX - startX)?0:1,aaY = abs(endY - startY) < abs(endX - startX)?1:0,i=0,color=0;i <= ((abs(endX-startX)>abs(endY-startY))?abs(endX-startX):abs(endY-startY));++i,iX += iteratorX,iY += iteratorY)
{
putpixel(screen,(int)iX,(int)iY, makecol((int)(color =(int)(255.0f * pow(1.0f - abs((float)iX - (int) iX) - abs((float)iY - (int) iY),(aaY!=0)?0.3f:0.5f))),(int)color,(int)color));
putpixel(screen,(int)iX+(int)aaX, (int) iY + (int)aaY, makecol((int)(color = (int) (255.0f * pow(abs( (float) iY - (int) iY)+abs((float)iX - (int) iX),(aaY!=0)?0.3f:0.5f))), (int)color, (int)color));
}
release_screen();
}
btw.: für schwarzen hintergrund optimiert