ბრეზენჰემის წრეწირის რკალის აგების ალგორითმი

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

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

მერვე საკმარისია რედაქტირება

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

ბაზური ალგორითმი რედაქტირება

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

 
Schéma

ეს აგებს პროცესს იტერაციებით, თითოეული იტერაცია ააქტიურებს ერთ პიქსელს. წარმოვიდგინოთ რომ, ჩვენ ვართ P პიქსელში, რომელიც უნდა ჩაისვას შემდეგ პიქსელში. რადგანაც ჩვენ ვართ მეორე ოქტეტში, ეს პიქსელი იქნება E ან F წერტილი. ბრეზენჰემის მეთოდის მიზანია შეაფასოს ტოლობის "იდეალური" წრეწირი   გადის თუ არა M წერტილის ზევით ან ქვევით, EF სეგმენტის შუა წერტილი იმისათვის, რომ შესაბამისად გაააქტიუროს E ან F პიქსელი.

საჭიროა, რომ ყოველ იტერაციაზე გამოითვალოს m ცვლადი ისეთი, რომ  . მაშინ :

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

ალგორითმის ოპტიმიზაცია რედაქტირება

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

ვთქვათ, ჩვენ ვიმყოფებით   წერტილში, რომლის კოორდინატები მოთავსებულია პიქსელების გრაფიკზე   და ვითვლით m ცვლადს. ჩვენ ვიცით, რომ M–ის კოორდინატებია  . მაშინ  . რადგანც ჩვენ გვინდა რომ მხოლოდ ვიმუშაოდ მთელ რიცხვებზე და რადგანაც ჩვენ მარტო m ნიშანი გვაინტერესებს, გამოვიყენებთ შემდეგ ტოლობას (1):  .

შევცვალოდ m ცვლადი E ან F პიქსელის არჩევის ფუნქციაში. დავარქვათ   m–ის ძველი მნიშვნელობა და   m–ის ახალი მნიშვენლობა.

  • თუ ჩვენ ავირჩევთ E-ს, მაშინ  . მაგრამ(1) ტოლობის მიხედვით,

 , მაშასადამე   სადაც  . იმ ფაქტის გამოყენებით, რომ  , ჩვენ ვიღებთ  . თუ ჩვენ ამოვირჩევთ E-ს, უნდა გავზარდოთ  –ის  .

  • თუ ჩვენ ამოვირჩევთ F-ს, მაშინ  . E–ს შემთხვევაში ანალოგიური მსჯელობის შესრულებით , ჩვენ ვამტკიცებთ, რომ, თუ ჩვენ ვირჩევთ F-ს, უნდა გავზარდოთ  –ის  .

ჩვენ ვხვდებით, რომ m–ის იტერაციული გამოთვლა:  , სადაც d უდრის 0, თუ ვირჩევთ E-ს, და  , თუ ვირჩევთ F-ს.

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

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

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

პროცედურა 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"

გაფართოება რედაქტირება

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

მეთოდის შეზღუდვები რედაქტირება

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