Algorithmus von Cohen-Sutherland

Der Algorithmus von Cohen-Sutherland ist ein Algorithmus zum Abschneiden (Clipping) von Linien an einem Rechteck. Er ist nach seinen Erfindern Danny Cohen und Ivan Sutherland benannt. Der Algorithmus gilt als populärster, wenn auch nicht effizientester für seine Zwecke. Er eignet sich besonders für Fälle, in denen ein hoher Anteil der zu clippenden Linien inner- oder außerhalb des Rechtecks liegt.

Schritte

Zuerst werden jeweils für die beiden Endpunkte der zu zeichnenden Linie vier Flags ermittelt, die gesetzt werden, wenn sich der Endpunkt links des Rechtecks, rechts davon, darunter oder darüber befindet. Ist keines der Flags gesetzt, dann liegen beide Endpunkte innerhalb des Rechtecks, es ist kein Clipping notwendig und die Linie kann einfach gezeichnet werden.

Illustration Clipping Maske

Wenn dieser triviale Fall nicht eintritt, werden im nächsten Schritt die einander entsprechenden Flags beider Endpunkte angesehen. Ist mindestens eines dieser Flags bei beiden Endpunkten gesetzt, so befindet sich die gesamte Linie außerhalb des Rechtecks und die Linie braucht nicht gezeichnet zu werden.

Wenn auch dieser einfache Fall nicht auftritt, wird der Schnittpunkt einer (beliebigen) Rechteck-Seite mit dem Liniensegment berechnet und der überlappende Teil erneut getestet (und eventuell gekürzt), bis schließlich beide Punkte innerhalb des Rechtecks liegen.

Implementierung

Das folgende Programm gibt ein Beispiel einer Implementierung des Cohen-Sutherland-Algorithmus in C++, anhand dessen man die Funktionsweise gut nachvollziehen kann.

 /*----------------------------------------------------------------------------------------
 Clipping der zwei X,Y Koordinaten einer Linie innerhalb eines zweidimensionalen
 Clipping Rechtecks XMin,YMin,XMax,YMax nach Cohen Sutherland.

 Nach Ablauf der Funktion sind die Koordinaten der beiden Punkte so geclippt, dass sie
 innerhalb des Clipping Rechtecks liegen und der Linie entsprechen, die übrig bleibt,
 wenn man die außerhalb liegenden Teile abschneidet.

 Falls kein Teil der Linie das Clipping Rechteck überstreicht, liefert die Funktion den
 Wert FALSE zurück.

 x1,y1   : Koordinate des Anfangspunktes der Linie
 x2,y2   : Koordinate des Endpunktes     der Linie
 return  : FALSE Linie ist komplett geclippt und braucht nicht gezeichnet zu werden.
           TRUE  Die Koordinaten sind geclippt und die Linie kann jetzt gezeichnet werden
 ------------------------------------------------------------------------------------------*/

 #define CLIPLEFT  1  // Binär   0001
 #define CLIPRIGHT 2  //         0010
 #define CLIPLOWER 4  //         0100
 #define CLIPUPPER 8  //         1000

 bool clipline(int &x1,int &y1,int &x2,int &y2)
 {
 int K1=0,K2=0;             // Variablen mit je 4 Flags für rechts, links, oben, unten.
 int dx,dy;

  dx=x2-x1;                 // Die Breite der Linie vorberechnen für spätere Koordinaten Interpolation
  dy=y2-y1;                 // Die Höhe   der Linie vorberechnen für spätere Koordinaten Interpolation

 // Die folgende Abfrage setzt die Flags CLIPLEFT,CLIPRIGHT,CLIPUPPER,CLIPLOWER, falls die Koordinate
 // auf einer oder zwei Seiten außerhalb des Clip Rechtecks liegt. Ein Punkt kann nicht gleichzeitig
 // rechts und links (bzw. oben und unten) außerhalb liegen, daher können nur maximal 2 Flags gesetzt sein.
 // Es gibt 9 Möglichkeiten. Davon sind 8 ungleich 0 und zeigen an, dass die Koordinate geclippt werden muss.

 if(y1<YMin) K1 =CLIPLOWER;  // Ermittle, wo der Anfangspunkt außerhalb des Clip Rechtecks liegt.
 if(y1>YMax) K1 =CLIPUPPER;  // Es werden entweder CLIPLOWER oder CLIPUPPER und/oder CLIPLEFT oder CLIPRIGHT gesetzt
 if(x1<XMin) K1|=CLIPLEFT;   // Es gibt 8 zu clippende Kombinationen, je nachdem in welchem der 8 angrenzenden
 if(x1>XMax) K1|=CLIPRIGHT;  // Bereiche des Clip Rechtecks die Koordinate liegt.

 if(y2<YMin) K2 =CLIPLOWER;  // Ermittle, wo der Endpunkt außerhalb des Clip Rechtecks liegt.
 if(y2>YMax) K2 =CLIPUPPER;  // Wenn keines der Flags gesetzt ist, dann liegt die Koordinate
 if(x2<XMin) K2|=CLIPLEFT;   // innerhalb des Rechtecks und muss nicht geändert werden.
 if(x2>XMax) K2|=CLIPRIGHT;

 // Schleife nach Cohen Sutherland, die maximal zweimal durchlaufen wird

  while(K1 || K2)    // muss wenigstens eine der Koordinaten irgendwo geclippt werden?
  {

 // wenn beide Koordinaten entweder links, rechts, über oder unter dem Clipping Rechteck liegen
 // ist kein Teil der Linie sichtbar, daher ist keine weitere Berechnung notwendig.
 // Die geclippte Linie ist unsichtbar.

    if(K1 & K2)      // logisches AND der beiden Koordinaten Flags ungleich 0?
      return FALSE;  // beide Punkte liegen jeweils auf der gleichen Seite außerhalb des Rechtecks

    if(K1)                       // schnelle Abfrage, muss Koordinate 1 geclippt werden?
    {
      if(K1 & CLIPLEFT)          // ist Anfangspunkt links außerhalb?
      {                          // ja
        y1+=(XMin-x1)*dy/dx;     // berechne y1 durch lineare Interpolation, dx kann hier nie 0 sein
        x1=XMin;                 // setze x1 an den linken Rand des Clip Rechtecks
      }
      else if(K1 & CLIPRIGHT)    // ist Anfangspunkt rechts außerhalb?
      {                          // ja
        y1+=(XMax-x1)*dy/dx;     // berechne y1 durch lineare Interpolation, dx kann hier nie 0 sein
        x1=XMax;                 // setze x1 an den rechten Rand des Clip Rechtecks
      }
      if(K1 & CLIPLOWER)         // ist Anfangspunkt unterhalb des Rechtecks?
      {                          // ja
        x1+=(YMin-y1)*dx/dy;     // berechne x1 durch lineare Interpolation, dy kann hier nie 0 sein
        y1=YMin;                 // setze y1 an den unteren Rand des Clip Rechtecks
      }
      else if(K1 & CLIPUPPER)    // ist Anfangspunkt oberhalb des Rechtecks?
      {                          // ja
        x1+=(YMax-y1)*dx/dy;     // berechne x1 durch lineare Interpolation, dy kann hier nie 0 sein
        y1=YMax;                 // setze y1 an den oberen Rand des Clip Rechtecks
      }
      K1 = 0;                    // Erst davon ausgehen, dass der Punkt jetzt innerhalb liegt,
                                 // falls das nicht zutrifft, wird gleich korrigiert.
      if(y1<YMin) K1 =CLIPLOWER; // ermittle erneut, wo der Anfangspunkt jetzt außerhalb des Clip Rechtecks liegt
      if(y1>YMax) K1 =CLIPUPPER; // Für einen Punkt, bei dem im ersten Durchlauf z. B. CLIPLEFT gesetzt war,
      if(x1<XMin) K1|=CLIPLEFT;  // kann im zweiten Durchlauf z. B. CLIPLOWER gesetzt sein
      if(x1>XMax) K1|=CLIPRIGHT;
    }

    // muss hier nochmal getestet werden, sonst werden Linien, die über Eck außerhalb liegen nicht korrekt behandelt
    if(K1 & K2)      // logisches AND der beiden Koordinaten Flags ungleich 0?
      return FALSE;  // beide Punkte liegen jeweils auf der gleichen Seite außerhalb des Rechtecks

    if(K2)                       // schnelle Abfrage, muss Koordinate 2 geclippt werden?
    {                            // ja
      if(K2 & CLIPLEFT)          // liegt die Koordinate links außerhalb des Rechtecks?
      {                          // ja
        y2+=(XMin-x2)*dy/dx;     // berechne y durch lineare Interpolation, dx kann hier nie 0 sein
        x2=XMin;                 // setze die x Koordinate an den linken Rand
      }
      else if(K2 & CLIPRIGHT)    // liegt die Koordinate rechts außerhalb des Rechtecks?
      {                          // ja
        y2+=(XMax-x2)*dy/dx;     // berechne y durch lineare Interpolation, dx kann hier nie 0 sein
        x2=XMax;                 // setze die x Koordinate an den rechten Rand
      }
      if(K2 & CLIPLOWER)         // liegt der Endpunkt unten außerhalb des Rechtecks?
      {                          // ja
        x2+=(YMin-y2)*dx/dy;     // berechne x durch lineare Interpolation, dy kann hier nie 0 sein
        y2=YMin;                 // setze die y Koordinate an den unteren Rand
      }
      else if(K2 & CLIPUPPER)    // liegt der Endpunkt oben außerhalb des Rechtecks?
      {                          // ja
        x2+=(YMax-y2)*dx/dy;     // berechne x durch lineare Interpolation, dy kann hier nie 0 sein
        y2=YMax;                 // setze die y Koordinate an den oberen Rand
      }
      K2 = 0;                    // Erst davon ausgehen, dass der Punkt jetzt innerhalb liegt,
                                 // falls das nicht zutrifft, wird gleich korrigiert.
      if(y2<YMin) K2 =CLIPLOWER; // ermittle erneut, wo der Endpunkt jetzt außerhalb des Clip Rechtecks liegt
      if(y2>YMax) K2 =CLIPUPPER; // Ein Punkt, der z. B. zuvor über dem Clip Rechteck lag, kann jetzt entweder
      if(x2<XMin) K2|=CLIPLEFT;  // rechts oder links davon liegen. Wenn er innerhalb liegt wird kein
      if(x2>XMax) K2|=CLIPRIGHT; // Flag gesetzt.
    }
  }             // Ende der while Schleife, die Schleife wird maximal zweimal durchlaufen.
  return TRUE;  // jetzt sind die Koordinaten geclippt und die gekürzte Linie kann gezeichnet werden
 }

Read other articles:

Гавайские каникулыангл. Hawaiian Vacation Другое название История игрушек: Гавайские каникулы Жанр комедия Техника анимации компьютерная Режиссёр Гэри Райдстром Авторы сценария Эрик Бенсон Джейсон Кац Гэри Райдстром Роли озвучивали Том ХэнксТим Аллен,Джоан КьюсакДон Рикл�...

Đại học Công nghệ Quốc phòng Trung Quốc国防科学技术大学Cổng trườngVị tríChángshā, Hồ Nam, Hồ Nam, Trung QuốcThông tinTên cũChangsha Institute of Technology Harbin Military Academy of EngineeringLoạiĐại học Quốc giaThành lập1953Giảng viên2,000Số Sinh viên17,000Websitehttp://www.nudt.edu.cn/Thống kêSinh viên đại học11,000 Đại học Công nghệ Quốc phòng Trung Quốc (tên tiếng Anh: National University of Defense Techn...

Ini adalah nama Korea; marganya adalah Lee. Lee Sun GyunLee pada 2018Lahir(1975-03-02)2 Maret 1975 Korea SelatanNama lainLee Sun KyunLee Seon KyunLee Seon GyoonPekerjaanAktorTahun aktif2001–sekarangSuami/istriJeon Hye JinNama KoreaHangul이선균 Alih AksaraI Seon-gyunMcCune–ReischauerI Son-kyun Lee Sun Gyun (Hangul: 이선균, lahir 2 Maret 1975) adalah aktor asal Korea Selatan. Lee Sun Gyun memulai debutnya sebagai seorang aktor musikal. Ia mulai dikenal oleh masyarakat m...

British trade unionist, industrialist and politician The Right HonourableThe Lord Robens of WoldinghamPCRobens in 1947Shadow Foreign SecretaryIn office14 December 1955 – 6 November 1956LeaderHugh GaitskellPreceded byPosition establishedSucceeded byAneurin BevanMinister of Labour and National ServiceIn office24 April 1951 – 26 October 1951Prime MinisterClement AttleePreceded byNye BevanSucceeded byWalter MoncktonMember of Parliamentfor BlythIn office23 February 1950 ...

Branch of the New York Public Library in Manhattan, New York Stavros Niarchos Foundation LibraryThe Stavros Niarchos Foundation Library, popularly known as the Mid-Manhattan Library40°45′07″N 73°58′54″W / 40.75183°N 73.98156°W / 40.75183; -73.98156Location455 Fifth Avenue, Manhattan, New York, United StatesTypeCirculating libraryEstablishedOctober 1970 (1970-10)Architect(s)T. Joseph Bartley(original)Mecanoo(renovation)Branch ofNew York Public Libr...

Huruf KirilYe Ukraina Penggunaan Fonetis:[je], [jɛ]Nama:єстъNomor Kiril:5Alfabet KirilHuruf SlaviaАА́А̀А̂А̄ӒБВГҐДЂЃЕЕ́ÈЕ̂ЁЄЖЗЗ́ЅИИ́ЍИ̂ЙІЇЈКЛЉМНЊОŌПРСС́ТЋЌУУ́ У̀У̂ӮЎФХЦЧЏШЩЪЫЬЭЮЯHuruf non-SlaviaӐА̊А̃Ӓ̄ӔӘӘ́Ә̃ӚВ̌ҒГ̑Г̣Г̌ҔӺҒ̌ӶД̌Д̣Д̆ӖЕ̄Е̃Ё̄Є̈ӁҖӜҘӞЗ̌З̱З̣ԐԐ̈ӠӢИ̃ҊӤҚӃҠҞҜК̣ԚӅԮԒӍӉҢԨӇҤО́О̀О̆О̂О̃ӦӦ̄ӨӨ̄Ө́Ө̆ӪҨԤР̌ҎҪС̣С�...

Jeff Colyer 46.º Gobernador de Kansas 31 de enero de 2018-14 de enero de 2019Teniente gobernador Tracey MannPredecesor Sam BrownbackSucesor Laura Kelly 49. ° Teniente gobernador de Kansas 10 de enero de 2011-31 de enero de 2018Gobernador Sam BrownbackPredecesor Troy FindleySucesor Tracey Mann Miembro del Senado de Kansas 12 de enero de 2009-10 de enero de 2011Predecesor Dennis M. WilsonSucesor Raymond Merrick Miembro de la Cámara de Representantes de Kansas 8 de enero de 2007-12 de enero d...

جامعة ماساتشوستس في بوسطن   معلومات التأسيس 1964[1]  الكليات 1,243 (2016)[2] الموقع الجغرافي إحداثيات 42°18′48″N 71°02′18″W / 42.313432°N 71.038445°W / 42.313432; -71.038445  [3] الرمز البريدي 02125-3393[4][5][6]  البلد الولايات المتحدة[6]  الإدارة الرئيس Marty Meehan �...

この記事には適切な導入部や要約がないか、または不足しています。関連するスタイルマニュアルを参考にして記事全体の要点を簡潔にまとめ、記事の導入部に記述してください。(2014年9月) (使い方) エクステ Exte監督 園子温脚本 園子温安藤正軌真田真製作 岡田真服部紹男出演者 栗山千明大杉漣佐藤めぐみつぐみ町本絵里佐藤未来音楽 長谷川智樹主題歌 町本絵里

Đường sắt ở ÝMột đoàn tàu cao tốc tại Ga Trung tâm Milano StazioneVận hànhĐường sắt quốc giaFerrovie dello StatoNhà khai thácTrenitalia (quốc gia)Nuovo Trasporto Viaggiatori (quốc gia)Trenord (địa phương)Trasporto Passeggeri Emilia Romagna (địa phương) Thello (quốc tế)Mercitalia (tàu hàng)Thống kêLượt khách883.3 million (2019)[1]Hệ thống độ dàiTổng cộng16.723 km (10.391 mi)[2]Đường ray đôi7....

Bundle of skeletal muscle fibers Muscle fascicleStructure of a skeletal muscle. (Fascicle labeled at bottom right.)DetailsPart ofSkeletal muscleIdentifiersLatinfasiculus muscularisTA22006THH3.03.00.0.00003 Anatomical terminology[edit on Wikidata]Not to be confused with Nerve fascicle. A muscle fascicle is a bundle of skeletal muscle fibers surrounded by perimysium, a type of connective tissue.[1] Structure Muscle cells are grouped into muscle fascicles by enveloping perimysium con...

Perlombaan jalan cepat pada Kejuaraan Dunia Atletik tahun 2005 di Helsinki, Finlandia. Untuk Diingat : Jalan cepat (berasal dari bahasa Inggris: Racewalking) merupakan cabang olahraga atletik berjalan gerak maju dengan melangkah tanpa adanya hubungan terputus dengan tanah/kaki selalu kontak dengan tanah/kaki tidak ada saat melayang. Setiap kali melangkah kaki depan harus menyentuh tanah sebelum kaki belakang meninggalkan tanah. Kaki yang digerakkan maju ke depan harus diluruskan seja...

WTA-toernooi van Acapulco 2019 Winnares in het enkelspel, Wang Yafan Officiële naam Abierto Mexicano Telcel Editie 2019 (19e editie) Stad, land Acapulco, Mexico Locatie Princess Mundo Imperial Datum 25 februari–2 maart Auspiciën WTA Categorie International Prijzengeld US$ 250.000 Deelnemers 32 enkel, 24 kwal. / 16 dubbel Ondergrond hardcourt, buiten Tegelijk met ATP-toernooi van Acapulco Winnaar enkel Wang Yafan Winnaars dubbel Viktoryja Azarenka Zheng Saisai Vorige: 2...

Medical University in North Korea Pyongyang Medical University평양의학대학AddressYeonhwa-dong, Central District, Pyongyang, North Korea[1]39°00′38″N 125°44′35″E / 39.0104702254°N 125.743035551°E / 39.0104702254; 125.743035551 Pyongyang Medical University is the top medical school in North Korea.[1] History After the Department of Medical Science at Kim Il-sung University was split up in 1948, the Pyongyang Medical University was offici...

Wemyss School of NeedleworkTypePublicEstablished1877PrincipalDora WemyssAddressMain Street, Coaltown of Wemyss, Fife, KY1 4NX, Coaltown of WemyssWebsitewemyssneedlework.com The Wemyss School of Needlework was founded in 1877 by Dora Wemyss to teach a skill to local girls to enable them to earn a living. Today, the school still operates in its purpose-built building at Coaltown of Wemyss in Fife, Scotland, and includes a museum and archive. History The school was founded by Dora Wemyss in 1877...

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: The Blue Knight TV series – news · newspapers · books · scholar · JSTOR (May 2023) (Learn how and when...

Chinese basketball player Chen NanChen Nan in 2016No. 15 – Bayi KylinPositionCenterLeagueWCBAPersonal informationBorn (1983-01-08) January 8, 1983 (age 40)Qingdao, Shandong, ChinaNationalityChineseListed height6 ft 5 in (1.96 m)Listed weight204 lb (93 kg)Career history2009Chicago Sky Stats at WNBA.com Medals Women's basketball Representing  China Asian Games 2002 Busan Team 2006 Doha Team 2010 Guangzhou Team In this Chinese name, the family name is...

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (ديسمبر 2018) خوان مانويل أورتيز خيمينيز معلومات شخصية الميلاد 28 مايو 1986 (العمر 37 سنة)الطَّرف  الطول 1.73 م (5 قدم 8 بوصة) مركز اللعب مهاجم الجنسية إسبانيا  معلوم...

Portrait of Eugénio dos Santos Eugénio dos Santos de Carvalho (1711–1760) was a Portuguese architect and military engineer, responsible for the planning and rebuilding of Lisbon's Pombaline Lower Town after the 1755 earthquake.[1][2] Among other buildings he designed the Lisbon City Hall, which was destroyed by fire in 1863.[3] He designed the Palacio do Grilo, palace of the Lafões family in Lisbon. His austere design for apartment buildings with retail at ground ...

Regency in North Sumatra, IndonesiaWest Nias Regency Kabupaten Nias BaratRegencyA traditional Nias house in Mandrehe district SealMotto(s): Hasambua(Only One)CountryIndonesiaProvinceNorth SumatraRegency seatLahömiGovernment • RegentKhenoki Waruwu • Vice RegentEra Era HiaArea • Total520.34 km2 (200.90 sq mi)Population (mid 2022 estimate)[1] • Total91,346 • Density180/km2 (450/sq mi)Time zoneUTC+7...