**ბრეზენჰემის წრეწირის რკალის აგების ალგორითმი** ნებას რთავს ძალიან შემცირებული ალგორითმული სიძნელისათვის დახაზოს წრეწირები მატრიცული სახით. შექმნილია ჯაკ ბრეზენჰემის მიერ.

ბაზური ალგორითმის ახსნა პირველ ოქტეტში
--------------------------------------

### მერვე საკმარისია

თავიდან უნდა ავღნიშნოთ, რომ პიქსელების გრაფიკზე არსებობს ოთხი სიმეტრიის ღერძი წრეწირში, შემდეგი ორი მატრიცის ღერძი და ორი, რომლებიც წარმოადგენენ წრეწირზე მონიშნულ ბისექტრისებს. მაშასადამე მონიშვნის სექტორის წრეწირის რკალის დათვლისას, განსაზღვრული სიმეტრიის ღერძებით, საკმარისია გამოიყენო სიმეტრია, რომ დააფიქსირო დანარჩენი შვიდი პიქსელი.

### ბაზური ალგორითმი

მანამდე ახსნილი სიმეტრიული მიზეზების გამო, ახსნილი ალგორითმი იქნება ლიმიტირებული მეორე ოქტეტში(კუთხე მოთავსებულია {\displaystyle {\frac {\pi }{2}}} და {\displaystyle {\frac {\pi }{4}}} შორის), რომელიც მოგვიანებით იყო გავრცელებული. ალგორითმი იწყებს წრეწირის ყველაზე მაღალი წერტილიდან და ჩამოდის პირველ ბისექტრისამდე.

Schéma
ეს აგებს პროცესს იტერაციებით, თითოეული იტერაცია ააქტიურებს ერთ პიქსელს. წარმოვიდგინოთ რომ, ჩვენ ვართ P პიქსელში, რომელიც უნდა ჩაისვას შემდეგ პიქსელში. რადგანაც ჩვენ ვართ მეორე ოქტეტში, ეს პიქსელი იქნება E ან F წერტილი. ბრეზენჰემის მეთოდის მიზანია შეაფასოს ტოლობის "იდეალური" წრეწირი {\displaystyle x^{2}+y^{2}-R^{2}=0} გადის თუ არა M წერტილის ზევით ან ქვევით, EF სეგმენტის შუა წერტილი იმისათვის, რომ შესაბამისად გაააქტიუროს E ან F პიქსელი.

საჭიროა, რომ ყოველ იტერაციაზე გამოითვალოს m ცვლადი ისეთი, რომ {\displaystyle m={x\_{M}}^{2}+{y\_{M}}^{2}-R^{2}}. მაშინ :

* m > 0 ⇒ M იდეალური წრეწირის ზევით ⇒ F-ის არჩევა ⇒ გაზარდო x, შეამცირო y
* m < 0 ⇒ M იდეალური წრეწირის ქვევით ⇒ E-ს არჩევა ⇒ გაზარდო x

### ალგორითმის ოპტიმიზაცია

იმისათვის, რომ მოვახდინოთ ალგორითმის ოპტიმიზაცია, რეკურსიულად უნდა გამოვთვალოდ m ცვლადი.

ვთქვათ, ჩვენ ვიმყოფებით {\displaystyle P\_{i}} წერტილში, რომლის კოორდინატები მოთავსებულია პიქსელების გრაფიკზე {\displaystyle (x\_{i};y\_{i})} და ვითვლით m ცვლადს. ჩვენ ვიცით, რომ M–ის კოორდინატებია {\displaystyle (x\_{m}=x\_{i}+1;y\_{m}=y\_{i}-0,5)}. მაშინ {\displaystyle m={x\_{M}}^{2}+{y\_{M}}^{2}-R^{2}={(x\_{i}+1)}^{2}+{(y\_{i}-0,5)}^{2}-R^{2}={x\_{i}}^{2}+{y\_{i}}^{2}+2x\_{i}-y\_{i}+1,25-R^{2}}. რადგანც ჩვენ გვინდა რომ მხოლოდ ვიმუშაოდ მთელ რიცხვებზე და რადგანაც ჩვენ მარტო m ნიშანი გვაინტერესებს, გამოვიყენებთ შემდეგ ტოლობას (1): 
{\displaystyle 4m=4{x\_{i}}^{2}+4{y\_{i}}^{2}+8x\_{i}-4y\_{i}+5-4R^{2}}.

შევცვალოდ m ცვლადი E ან F პიქსელის არჩევის ფუნქციაში. დავარქვათ {\displaystyle m\_{i}} m–ის ძველი მნიშვნელობა და {\displaystyle m\_{i+1}} m–ის ახალი მნიშვენლობა.

* თუ ჩვენ ავირჩევთ E-ს, მაშინ {\displaystyle (x\_{i+1}=x\_{i}+1,y\_{i+1}=y\_{i})}. მაგრამ(1) ტოლობის მიხედვით,

{\displaystyle 4m\_{i+1}=4{x\_{i+1}}^{2}+4{y\_{i+1}}^{2}+8x\_{i+1}-4y\_{i+1}+5-4R^{2}}, მაშასადამე 
{\displaystyle 4m\_{i+1}=4({x\_{i+1}}^{2}+2x\_{i}+1^{2})+4{y\_{i}}^{2}+8(x\_{i}+1)-4y\_{i}+5-4R^{2}} სადაც 
{\displaystyle 4m\_{i+1}=4{x\_{i}}^{2}+4{y\_{i}}^{2}+8x\_{i}-4y\_{i}+5-4R^{2}+8x\_{i}+12}. 
იმ ფაქტის გამოყენებით, რომ {\displaystyle 4m\_{i}=4{x\_{i}}^{2}+4{y\_{i}}^{2}+8x\_{i}-4y\_{i}+5-4R^{2}}, ჩვენ ვიღებთ
{\displaystyle 4m\_{i+1}=4m\_{i}+8x\_{i}+12=4m\_{i}+8x\_{i+1}+4}. 
თუ ჩვენ ამოვირჩევთ E-ს, უნდა გავზარდოთ {\displaystyle 8x\_{i+1}+4}–ის {\displaystyle 4m\_{i}}.

* თუ ჩვენ ამოვირჩევთ F-ს, მაშინ {\displaystyle (x\_{i+1}=x\_{i}+1,y\_{i+1}=y\_{i}+1)}. E–ს შემთხვევაში ანალოგიური მსჯელობის შესრულებით , ჩვენ ვამტკიცებთ, რომ, თუ ჩვენ ვირჩევთ F-ს, უნდა გავზარდოთ {\displaystyle 8x\_{i+1}+4-8y\_{i+1}}–ის {\displaystyle 4m\_{i}}.

ჩვენ ვხვდებით, რომ m–ის იტერაციული გამოთვლა: {\displaystyle m\_{i+1}=m\_{i}+8x\_{i+1}+4-d}, სადაც d უდრის 0, თუ ვირჩევთ E-ს, და {\displaystyle 8y\_{i+1}}, თუ ვირჩევთ F-ს.

იმისათვის, რომ მოქმედებაში მოვიყვანოთ იტერაციული გამოთვლა, ჩვენ ავღნიშნავთ , რომ {\displaystyle m\_{0}={(-1)}^{2}+{(R-0,5)}^{2}-R^{2}}. მაშასადმე {\displaystyle 4m\_{0}=5-4R}.

ოპტიმიზირებული ალგორითმი
------------------------

ერთი ოქტეტის აგების ალგორითმი:

```
პროცედურა tracerOctant (მთელი rayon, მთელი x_centre, მთელი y_centre)
	მთელი x, y, m–ის გამოცხადება;
	x ←0 ;
	y ← R ; 	//ჩვენ ვმდებარეობთ  წრეწირის ზემოთ 
	m ←5-4*rayon ;		// ინიციალიზაცია
	მაშინ როდესაც x < y 	//როცა ის არის მეორე ოქტეტში
		tracerPixel( x+x_centre , y+y_centre ) ;
		თუ m > 0 მაშინ		// F წერტილის არჩევა
			y ← y - 1 ;
			m ← m-8*y ;	// შეესაბამება "d"–ს  ახსნებს
		თუ დასასრული;
		x ← x+1 ;
		m ← m + 8*x+4 ;
	მაშინ როდესაც დასასრული;
პროცედურა დასასრული ;

```

ჩავინიშნოთ, რომ აქ m ცვალდი წარმოადგენს წინა პარაგრაფის "4m"–ს, რაც ჩვენ შეგვიძლია ნება დავრთოდ ჩვენ თავს, რადგანაც მხოლოდ გვაინტერესებს 4m–ის ნიშანი და ეს იგივეა რაც m–ის.

მთელი წრეწირის აგების ალგორითმი:

```
პროცედურა tracerOctant (მთელი rayon, მთელი x_centre, მთელი y_centre)
	მთელი x, y, m–ის გამოცხადება;
	x ←0 ;
	y ← R ; 	// ჩვენ მდებარეობთ წრეწირის ზევით
	m ←5-4*rayon ;		// ინიციალიზაცია
	მაშინ როდესაც x < y 	// როდესაც ის არის მეორე ოქტეტში

		tracerPixel( x+x_centre , y+y_centre ) ;
		tracerPixel( y+x_centre , x+y_centre ) ;
		tracerPixel( -x+x_centre , y+y_centre ) ;
		tracerPixel( -y+x_centre , x+y_centre ) ;
		tracerPixel( x+x_centre , -y+y_centre ) ;
		tracerPixel( y+x_centre , -x+y_centre ) ;
		tracerPixel( -x+x_centre , -y+y_centre ) ;
		tracerPixel( -y+x_centre , -x+y_centre ) ;
		თუ m > 0 მაშინ	// F წერტილის არჩევა
			y ← y - 1 ;
			m ← m-8*y ;
		თუ დასასრული;
		x ← x+1 ;
		m ← m + 8*x+4 ;
	მაშინ როდესაც დასასრული;
პროცედურა დასასრული;

```

ჩვენ ვმოქმედებთ მხოლოდ სიმეტრიულად განსხვავებულ ოქტეტებში.

შენიშვნები ბრეზენჰემის მეთოდზე
------------------------------

### სირთულის სისუსტე

ჩვენ მანამდე ვნახეთ, რომ ყოველი მდებარე პიქსელისათვის გამოანგარიშების სირთულე მცირდება X-ს დამატებით, Y გამრავლებით და Z შედარებით, ჩვეულებრივი ტრიგონომეტრიული ფუნქციის ან კვარდატული ფესვის გამოყენებით საჭირო იქნება ალგორითმული მნიშვნელოვანი ღირებულების შედარება.

Illustration des "trous"
### გაფართოება

ჩვენ ასევე შეგვიძლია გამოვიყენოთ ამ ალგორითმის პრინციპი იმისათვის, რომ ავაგოთ ოვალი და ელიფსი.

### მეთოდის შეზღუდვები

თუ ჩვენ ვაგებთ უფრო და უფრო დიდ სხივის კონცენტრულ წრეწირებს, ჩვენ ავღნიშნავთ, რომ ჩვენ ვერ მივაღწევთ ყველა გეგმის შევსებას: არსებობს "სუსტი წერტილები". ეს ნაკლი გვაიძულებს, რომ გამოვიყენოთ სხვა მეთოდები, როგორიც არის ანდრეს წრეწირის რკალის აგების ალგორითმი.