[elektro] Vonal rajzolás

Horvath Janos winnerbt at fibermail.hu
Sat Mar 21 11:21:33 CET 2009


Szia!
Anno gravirmasinaban en szetosztottam 4 negyedre a koordinatarendszert,
de 45-fokban elforgatva. (szoval az 1. negyed az +45 és -45fok-ban volt.
Igy 4 rutin lett (sebesseg miatt) es nem kellett elojeles dolgokkal
szenvedni. Szoval azert volt igy, mert ebben a negyedben pl. az X csak 
novekszik, es a ciklusszamlalo is mindig a DeltaX, mig ha meghagytam 
volna a normal negyedelest, akkor 0-45fokig X a szamlalo, 45-90fokig
az Y lett volna, szoval lustasagbol volt.
Maga az algoritmus Bresenham's volt. Korrajzolasra nyolcadokra bontva
volt megirva, az LCDre kivalo, mechanikara nem annyira.
M128 16MHz-rol max 5000 pont/sec-el tudta szamolni, de pontosan nem
mertem, mert megszakitasbol volt.
(de mar regen volt...kb ennyi maradt meg)
Ha aranylag kis teruletre kell megcsinalni, akkor bittomoritett
tablazatosat is csinalhatsz, tobb helyet foglal, de a leggyorsabb.
Korrajzolot irtam igy LCDre, haaat kb 5x gyorsabb mint mas.
Az LCD autoincrementjet szerintem nem tudod hasznalni, mert
az byte-os, raadasul egy pont kirakashoz elobb beolvasas kell,
esetleg exor-ozas, es visszairas.

JAni
11:20

> Én is... :)
> Ehhez hasonlót kezdtem el, csak gépikódban.
> Aztán kezdett bonyolódni a 4 irány kezelésével, meg a 2 byte-os x 
> kezeléssel.
> Ha nem marad más, átdolgozom assembly-be.
> 
> Ezt a visszafejtést hol érdemes keresni? Magyar oldal alig van 10, angol 
> meg több százezer...
> 
> A kijelző tud auto increment-et, lehet, hogy valahol még az is kapóra jön.
> 
> 
> ToPe
> 
> Huszti Andras írta:
>> En egy gyors megoldast valasztottam:
>>
>> void lcd_linexy(signed char dx, signed char dy, unsigned char color){
>> 	//todo
>> 	unsigned int ddx, ddy;
>> 	signed int i, j, dirx, diry;
>> 	double tg;
>> 	if (dx > 0 ) {
>> 		dirx = 1;
>> 		ddx = dx;
>> 	} else {
>> 		dirx = -1;
>> 		ddx = -dx;
>> 	}
>>
>> 	if (dy > 0 ) {
>> 		diry = 1;
>> 		ddy = dy;
>> 	} else {
>> 		diry = -1;
>> 		ddy = -dy;
>> 	}
>>
>> 	if (ddx > ddy) {
>> 		tg = (double)ddy / (double)ddx;
>> 		for (i = 0; i <= ddx; i++) {
>> 			j = (double)i * tg;
>> 				lcd_put_pixel(pen_x + (i * dirx), pen_y + (j * diry), color & 0x01);
>> 		}
>> 	} else {
>> 		tg = (double)ddx / (double)ddy;
>> 		for (i = 0; i <= ddy; i++) {
>> 			j = (double)i * tg;
>> 				lcd_put_pixel(pen_x + (j * dirx), pen_y + (i * diry), color & 0x01);
>> 		}
>> 	}
>> }
>>
>>
>>   
> 
> -----------------------------------------
>           elektro[-flame|-etc]
> 



More information about the Elektro mailing list