Skip to main content

ბეზიეს წირი

Bezier Curve

        ბეზიეს წირები ფართოდ გამოიყენება კომპიუტერული მეცნიერების სხვადასხვა მიმართულებებში CAD სისტემებში, კომპიუტერულ გრაფიკაში და ა.შ. ისისნი პოპულარობით სარგებლობენ მისი სიმარტივის, ინტუიტიურობის და მოსახერხებულობის გამო.
        მათემატიკურად ბეზიეს წირი არის ფუნქცია რომელსაც გადაეცემა ერთი პარამეტრი t(0-დან 1-მდე) და ის გვიბრუნებს წერტილს წირზე. ფუნქციის მნიშვნელობა დამოკიდებულია შემავალ t პარამეტრზე და n ცალ წერტილზე, რომლიდანაც პირველ და ბოლო წერტილს ვუწოდებთ კვანძებს(knots), ხოლო დანარჩენებს საკონტროლო წერტილებს(Control points). როდესაც t=0 ფუნქცია გვიბრუნებს პირველ კვანძს, როდესაც t=1 ფუნქცია გვიბრუნებს მეორე კვანძს, დანარჩენ მნიშვნელობებზე ფუნქცია გვიბრუნებს წირის სხვა წერტილებს. გამოდის რომ წირი იწყება პირველი კვანძში დამოკიდებულია საკონტროლო წერტილებზე,თუმცა არ გადის მათზე და სრულდება მეორე კვანძში. მათემატიკურად ნებისმიერ ბეზიეს წირს შეესაბამება პოლინომი რომლის ხარისხიც არის მოცემული წერტილების რაოდენობაზე ერთით ნაკლები. მოცემული n წერტილისათვის წირის ხარისხი იქნება n-1.
სურათზე ნაჩვენებია მე-3 ხარისხის ბეზიეს წირი. 
        პირველი ხარისხის ბეზიეს წირი არის მონაკვეთი. შესაბამისად ფუნქცია რომელიც გვაძლევს წერტილს პირველი ხარისხის ბეზიეს წირზე ახდენს წრფივ გადასვლას პირველ და მეორე კვანძს შორის. მათემატიკუტად პირველი ხარისხის ბეზიეს წირის განმარტება ჩაიწერება ასე:
        როგორც განმარტებიდან ჩანს ხდება კვანძების კოორდინატების გამრავლება შესაბამის კოეფიციენტებზე და შემდეგ შეკრება. P0-ის კოეფიციენტი იქნება შესაბამისად (1-t) ხოლო P1-ის t. აქედან კარგად ჩანს რომ 0-ზე და 1-ზე ფუნქცია შესაბამისად გვაძლევს P0-ს და P1-ს.
        მეორე ხარისხის ბეზიეს წირი არის შესაბამისად პარაბოლა და მათემატიკურად აღიწერება ასე:

        ამ შემთხვევაში P0-ის, P1-ის და P2-ის კოეფიციენტები შესაბამისად არის (1-t)^2, 2*(1-t)*t და t^2. მეტი სიცხადისთვის შეგვიძლია ვნახოთ შესაბამისი კოეფიციენტები გრაფიკის სახით [0,1] ინტერვალში.
        მესამე ხარისხის ბეზიეს წირი მათემატიკურად ჩაიწერება ასე:
        ამ შემთხვევაში P0-ის, P1-ის P2-ის და P3-ის კოეფიციენტები შესაბამისად არის (1-t)^3, 3*(1-t)^2*t, 3*(1-t)*t^2 და t^3. ხოლო ამ კოეფიციენტების გრაფიკები გამოიყურება ასე.
        ნებისმიერი ხარისხის ბეზიეს წირის ზოგადი მატემატიკური სახე არის ასეთი:
        

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

VectorN GetCubicBezierPoint( double t, const VectorN& P0, const VectorN& P1, const VectorN& P2, const VectorN& P3 )
{
        double tt = t*t;
        double ttt = tt*t;
        double u = (1.0 - t);
        double uu = u*u;
        double uuu = uu*u;
        return uuu*P0 + 3*uu*t*P1 + 3*u*tt*P2 + ttt*P3;
}
        პროგრამული კოდი მოყვანილია C-ზე. VectorN იგულისხმება რომ არის n განზომილების ვექტორი რომელზეც გადატვირთულია შეკრების და სკალარული გამრავლების ოპერაციები.

        არსებობს კასტელჟაუს ალგორითმი(სახელი მოდის ფრანგი ფიზიკოსის და მეთემატიკოსის პაულ კასტელჯაუს გვარიდან) რომელიც რეკურსიული სახით ითვლის წერტილს ბეზიეს წირზე. რეკურსიის ყოველ ახალ სიღრმეზე გადასვლისას ხდება წირის ხარისხის შემცირება და სიღრმეში დავდივართ სასურველ წერტილზე. მოვიყვანოთ მაგალითი: ვთქვათ გვსურს ბეზიეს კუბურ წირზე(P0, P1, P2, P3) წერტილიზ პოვნა როდესაც t=0.5. რეკურსიის პირველ ეტაპზე n შუალედურ მონატვეთზე(P0P1, P1P2, P2P3) წერტილების მოძებნა წრფივი ინტერპოლაციით შესაბამისი t პარამეტრით. ეს წერტილები აღვლიშნოთ შესამაბისად K1, K2, K3-ით(იხილეთ ქვემოთ მოცემული სურათი). რეკურსიის შემდეგ ბიჯზე ხდება 2 მონაკვეთზე K1K2, K2K3-ზე იგივე t პარამეტრით 2 წერტილის L1, L2-ის გამოთვლა და ბოლოს რეკურსიის ბოლო დონეზე ხდება L1L2 მონაკვეთზე იგივე t პარამეტრით P წერტილის პოვნა რომელიც წარმოადგენს წერტილს შესაბამის ბეზიეს წირზე. ზუსტად ასევე ჩვენ შეგვიძლია ერთი ბეზიეს წირი გავჭრათ ნებისმიერ ადგილზე და მივიღოთ 2 ბეზიეს წირი. ამ შემთხვევაში ნაპოვნი p წერტილი გახდება პირველი შვილობილი წირის მეორე კვანძი და ამავე დროს მეორე შვილობილი წირის პირველი კვანძი. პირველი შვილობილი ბეზიეს წირის წერტილები იქნება შესამამისად: P0, K1, L1, P, ხოლო მეორე შვილობილი წირის წერტილები: P, L2, K3, P3.
სურათზე ნაჩვენებია კასტელჯაუს მეთოდით P წერტილის პოვნისა და წირის ორად გაყოფის პროცესი.
პირველი ხარისხის ბეზიეს წირი
მეორე ხარისხის ბეზიეს წირი
მესამე ხარისხის ბეზიეს წირი
        კასტელჟაუს რეკურსიული ალგორითმის პროგრამული განხორციელება გამოიყურება ასე:

VectorN GetCasteljauPoint( unsigned int degree, unsigned int index, double t, const VectorN* points )
{
        if (degree == 0)
                return points[index];
        VectorN p1 = GetCasteljauPoint( degree-1, index, t, points );
        VectorN p2 = GetCasteljauPoint( degree-1, index + 1, t, points );
        return VectorN::Lerp( p1, p2, t );
}


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

Comments

  1. მონაკვეთზე ტრივიალურია ეგეთი ფუნქციის პოვნა მაგრამ მრავალ წერტილზე როგორ გამოიყვანეს ფორმულა ეგ არ სწერია სადმე? პ.ს ძალიან საინტერესო იყო :))

    ReplyDelete
  2. კასტელჯაუს ალგორითმიდან პირდაპირ ჩანს. K1, K2 და K3-ს რომ ჩაწერ P0, P1, P2, P3-ის და t-ს საშუელებით. მერე მაგ K1, K2, K3-ის და t-ს საშუალებით ჩაწერ L1, L2-ს, მერე L1, L2-ის საშუალებით P-ს. გახსნი ფრჩხილებს და მიიღებ ზუსტად იმ ფორმით(წერტილებს თავისი კოეფიციენტებით).

    ReplyDelete
  3. ვა, რა მაგარი ტიპია :) მე მომეწონა. სღლ ქოი კი არა და ბეზიე და კასტელჟაუ:)

    ReplyDelete
  4. იფრო მაგარ ტიპებზე მერე დავწერ ;)

    ReplyDelete
  5. homm gasagebia exla, p.s es momexmara cota:
    p1 + (p2 - p1) * t = q1;

    p2 + (p3 - p2) * t = q2;

    q1 + (q2 - q1) * t

    article: http://www.create-games.com/article.asp?id=1866

    ReplyDelete
  6. ხო, მაგაზე მიწერია შუა ნაწილში. კასტელჟაუს ალგორითმი სადაც არის ახსნილი და წირის ორად გაყოფა :)

    ReplyDelete
  7. კასტელჟაუს მეთოდი იმდენად თავისი სიმარტივით არ გვაოცებს, რამდენადაც მისი უბრალოებითა და ფართო გამოყენების სპექტრით ცხოვრებაში..

    რაც შეეხება ბეზის, მისი წირის გარდაქმნა T(0)-დან T(1)-მდე იმდენად სცეფალოტაქსუსი, რომ რამის დაკოპირებაც კი ზედმეტია თვითონ ტექსტიდან.. ხომ?

    ReplyDelete
  8. კასტელჟაუს მეთოდის ცხოვრებაში გამოყენებისა რა გითხრა, მაგრამ როცა გჭირდება თავის საქმეს აკეთებს მშვენივრად.

    ReplyDelete

Post a Comment

Popular posts from this blog

CPU GPU და ჰიბრიდული რენდერერები

წყარო         დღემდე აქტუალურია თემა CPU რენდერერი ჯობია თუ GPU . იმისათვის რომ ამ კითხვას მეტნაკლებად ამომწურავი პასუხი გავცეთ განვიხილოთ რენდერერის სტრუქტურა და მოცემულ პლათფორმებზე იპმლემენტაციასთან დაკავშირებული პრობლემები. რენდერერი შედგება რამოდენიმე დიდი კომპონენტისგან როგორიცაა ხილვადობის ამოცანა შეფერადება ინტეგრატორები ფუნქციონალი ხილვადობის ამოცანა         ხილვადობის ამოცანა ერთერთი ყველაზე რთულია გამოთვლითი რესურსის კუთხით. გარდა იმისა, რომ სხივის გეომეტრიასთან თანაკვეთის დათვლას საკმაოდ დიდი დრო ჭირდება, ასევე საჭიროა ამაჩქარებელ სტრუქტურების განახლება კადრიდან კადრზე დინამიური სცენებისათვის. კარგი ისაა, რომ რენდერერის ეს ნაწილი საკმაოდ ადვილად ენკაპსულირებადია და შესაბამისად გვხვდება ბიბლიოთეკები მაგალითად embree(intel), fireRays(AMD), OptiX prime(nvidia), ... რომლებიც ამ ამოცანას საკმაოდ ეფექტურად ხსნიან და რენდერერებშიც მეტნაკლებად ადვილად ინტეგრირდებიან.  სხივების მიდევნების პროცესში ძალიან მნიშვნელოვანია მსგავსი გამოთვლების ლოკალიზება და არსებული SIMD

სინათლის ხილული სპექტრი და სხივის თვისებები

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

ფერების RGB მოდელი

RGB Color Model         ფერების RGB მოდელი წარმოადგენს ისეთ მოდელს რომელშიც სამი ძრირითადი ფერის წითელი, მწვანე და ლურჯის საშუალებით მიიღება ფერების ფართო სპექტრი. მისი დასახელებაც მოდის სწორედ ძირითადი ფერების ინგლისური სახელწოდების ინიციალებიდან(Red, Green, Blue).         ფერთა სპექტრის ამდაგვარი წარმოდგენა დაკავშირებულია იმასთან, რომ გამოსახულების გამოტანის მოწყობილობებში რომელიც გააჩნიათ კომპიუტერებს, ტელევიზორებს ფერის მიღება ფიზიკურად ხდება სწორედ ამ სამი ძირითადი ფერის შეზავებით. დღესდღეობით ყველაზე გავრცელებული არის 24 ბიტიანი RGB მოდელი, სადაც თითოეულ კომპონენტს ეთმობა ერთი ბაიტი და შესაბამისად შეუძლია მიიღოს ნებისმიერი მნიშვნელობა [0, 255] დიაპაზონში, რაც საბოლოოდ გვაძლევს 16777216 განსხვავებულ ფერს.