<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://monobook.org/w/index.php?action=history&amp;feed=atom&amp;title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0</id>
	<title>Cyrus Beckアルゴリズム - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://monobook.org/w/index.php?action=history&amp;feed=atom&amp;title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0"/>
	<link rel="alternate" type="text/html" href="https://monobook.org/w/index.php?title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&amp;action=history"/>
	<updated>2026-06-04T08:12:04Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://monobook.org/w/index.php?title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&amp;diff=12408&amp;oldid=prev</id>
		<title>Administrator: /* 関連項目 */</title>
		<link rel="alternate" type="text/html" href="https://monobook.org/w/index.php?title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&amp;diff=12408&amp;oldid=prev"/>
		<updated>2020-03-11T07:06:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;関連項目&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;https://monobook.org/w/index.php?title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&amp;amp;diff=12408&amp;amp;oldid=12407&quot;&gt;差分を表示&lt;/a&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://monobook.org/w/index.php?title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&amp;diff=12407&amp;oldid=prev</id>
		<title>Administrator: ページの作成:「&#039;&#039;&#039;Cyrus Beck アルゴリズム&#039;&#039;&#039;とは、線分をポリゴンの範囲内にクリッピングするアルゴリズムである。  Cohen Sutherlandアル…」</title>
		<link rel="alternate" type="text/html" href="https://monobook.org/w/index.php?title=Cyrus_Beck%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&amp;diff=12407&amp;oldid=prev"/>
		<updated>2020-03-11T06:50:34Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「&amp;#039;&amp;#039;&amp;#039;Cyrus Beck アルゴリズム&amp;#039;&amp;#039;&amp;#039;とは、線分を&lt;a href=&quot;/wiki/%E3%83%9D%E3%83%AA%E3%82%B4%E3%83%B3&quot; title=&quot;ポリゴン&quot;&gt;ポリゴン&lt;/a&gt;の範囲内に&lt;a href=&quot;/w/index.php?title=%E3%82%AF%E3%83%AA%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;「クリッピング」 (存在しないページ)&quot;&gt;クリッピング&lt;/a&gt;する&lt;a href=&quot;/wiki/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&quot; title=&quot;アルゴリズム&quot;&gt;アルゴリズム&lt;/a&gt;である。  Cohen Sutherlandアル…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Cyrus Beck アルゴリズム&amp;#039;&amp;#039;&amp;#039;とは、線分を[[ポリゴン]]の範囲内に[[クリッピング]]する[[アルゴリズム]]である。&lt;br /&gt;
&lt;br /&gt;
Cohen SutherlandアルゴリズムやNicholl Le Nichollアルゴリズムとは異なり、非矩形（＝ポリゴン）のクリッピングが可能となっている。&lt;br /&gt;
==C#での実装例==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Numerics;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
&lt;br /&gt;
public static class LineClipping&lt;br /&gt;
{&lt;br /&gt;
    public static Vector2[] CyrusBeck(Vector2[] vertices, Vector2[] line)&lt;br /&gt;
    {&lt;br /&gt;
        // 引数チェック&lt;br /&gt;
        if (vertices == null || vertices.Length &amp;lt; 3)&lt;br /&gt;
        {&lt;br /&gt;
            throw new ArgumentException(nameof(vertices));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (line == null || line.Length &amp;lt; 2)&lt;br /&gt;
        {&lt;br /&gt;
            throw new ArgumentException(nameof(line));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 頂点数&lt;br /&gt;
        var vcount = vertices.Length;&lt;br /&gt;
&lt;br /&gt;
        // 法線を計算&lt;br /&gt;
        var normal = new Vector2[vcount];&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; vcount; i++)&lt;br /&gt;
        {&lt;br /&gt;
            normal[i].X = vertices[i].Y - vertices[(i + 1) % vcount].Y;&lt;br /&gt;
            normal[i].Y = vertices[(i + 1) % vcount].X - vertices[i].X;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // P1-P0を計算&lt;br /&gt;
        var p1p0 = line[1] - line[0];&lt;br /&gt;
&lt;br /&gt;
        // P0-PEiを計算&lt;br /&gt;
        var p0pei = new Vector2[vcount];&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; vcount; i++)&lt;br /&gt;
        {&lt;br /&gt;
            p0pei[i] = vertices[i] - line[0];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 分子と分母を計算&lt;br /&gt;
        var numerator = new float[vcount];&lt;br /&gt;
        var denominator = new float[vcount];&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; vcount; i++)&lt;br /&gt;
        {&lt;br /&gt;
            numerator[i]   = Vector2.Dot(normal[i], p0pei[i]);&lt;br /&gt;
            denominator[i] = Vector2.Dot(normal[i], p1p0);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // enterとleavingを計算&lt;br /&gt;
        var t = new float[vcount];&lt;br /&gt;
        var tE = new List&amp;lt;float&amp;gt;();&lt;br /&gt;
        var tL = new List&amp;lt;float&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; vcount; i++)&lt;br /&gt;
        {&lt;br /&gt;
            t[i] = numerator[i] / denominator[i];&lt;br /&gt;
&lt;br /&gt;
            if (0 &amp;lt; denominator[i])&lt;br /&gt;
                tE.Add(t[i]);&lt;br /&gt;
            else&lt;br /&gt;
                tL.Add(t[i]);&lt;br /&gt;
        }&lt;br /&gt;
        tE.Add(0);&lt;br /&gt;
        tL.Add(1);&lt;br /&gt;
&lt;br /&gt;
        var temp = new float[2];&lt;br /&gt;
        temp[0] = tE.Max();&lt;br /&gt;
        temp[1] = tL.Min();&lt;br /&gt;
&lt;br /&gt;
        // 範囲外（外側）にあると思われる&lt;br /&gt;
        if (temp[1] &amp;lt; temp[0])&lt;br /&gt;
        {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // ポリゴンの内側にある部分だけを返す&lt;br /&gt;
        var result = new Vector2[2];&lt;br /&gt;
        result[0].X = line[0].X + p1p0.X * temp[0];&lt;br /&gt;
        result[0].Y = line[0].Y + p1p0.Y * temp[0];&lt;br /&gt;
        result[1].X = line[0].X + p1p0.X * temp[1];&lt;br /&gt;
        result[1].Y = line[0].Y + p1p0.Y * temp[1];&lt;br /&gt;
        return result;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連項目 ==&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; [[クリップスペース座標]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
</feed>