1. 程式人生 > >C#之繪製三角形

C#之繪製三角形

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShaderDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Vector3 t1 = Vector3.Zero();
            Vector3 t2 = new Vector3(0, 10, 0);
            Vector3 t3 = new Vector3(15, 5, 0);



            Vector3 t11 = new Vector3(-5, -5, 0);
            Vector3 t12 = new Vector3(5, -5, 0);
            Vector3 t13 = new Vector3(5, 5, 0);

            List<Vector3> vec3 = new List<Vector3>();
            vec3.Add(t1);
            vec3.Add(t2);
            vec3.Add(t3);
            vec3.Add(t11);
            vec3.Add(t12);
            vec3.Add(t13);


            while (true)
            {
                Console.Clear();//清楚畫面
                for (int i = 0; i < vec3.Count/3; i++)
                {
                    DrawTri(vec3[i * 3], vec3[i * 3 + 1], vec3[i * 3 + 2], i % 2 == 0 ? ',' : '0');
                }
                System.Threading.Thread.Sleep(100);
            }

        }

        /// <summary>
        /// 繪製三角形
        /// </summary>
        /// <param name="p0"></param>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="tag"></param>
        static void DrawTri(Vector3 p0, Vector3 p1, Vector3 p2, char tag)
        {
            //求出三角形的包圍盒
            float minx = Math.Min(p0.x, p1.x);
            float maxx = Math.Max(p0.x, p1.x);

            float miny = Math.Min(p0.y, p1.y);
            float maxy = Math.Max(p0.y, p1.y);

            minx = Math.Min(minx, p2.x);
            maxx = Math.Max(maxx, p2.x);

            miny = Math.Min(miny, p2.y);
            maxy = Math.Max(maxy, p2.y);

            for (int i = (int)minx; i < (int)maxx; i++)
            {
                for (int j = (int)miny; j < (int)maxy; j++)
                {
                    if (i < 0 || i >= 80)
                        continue;
                    if (j < 0 || j >= 25)
                        continue;
                    Vector3 p = new Vector3(i, j, 0);
                    if (PointInTriangle(p0, p1, p2, p))
                    {
                        Console.SetCursorPosition(i, j);
                        Console.Write(tag);
                    }
                }
            }

        }

        /// <summary>
        /// 三角形的點
        /// </summary>
        /// <param name="A"></param>
        /// <param name="B"></param>
        /// <param name="C"></param>
        /// <param name="P"></param>
        /// <returns></returns>
        static bool PointInTriangle(Vector3 A, Vector3 B, Vector3 C, Vector3 P)
        {
            return SameSide(A, B, C, P) && SameSide(B, C, A, P) && SameSide(C, A, B, P);
        }

        /// <summary>
        /// 點乘
        /// </summary>
        /// <param name="A"></param>
        /// <param name="B"></param>
        /// <param name="C"></param>
        /// <param name="P"></param>
        /// <returns></returns>
        static bool SameSide(Vector3 A,Vector3 B,Vector3 C,Vector3 P){
            Vector3 AB = B - A;
            Vector3 AC = C - A;
            Vector3 AP = P - A;
            //求出垂直於當前平面的向量
            Vector3 v1 = AB.Cross(AC);
            //求出垂直於當前平面的向量
            Vector3 v2 = AB.Cross(AP);
            //判斷這兩個平面的法向量的夾角 :0兩個向量是垂直的(90度)   >0:形成的是銳角  <0:角度大於90度   
            return v1.Dot(v2) >= 0;
        }
    }
}

相關推薦

C#繪製三角形

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ShaderDemo

OpenGL學習筆記繪製三角形

參考https://learnopengl.com/ 1、建立視窗 glfw是一個針對OpenGL的視窗管理庫,這裡使用glfw庫建立視窗並處理輸入,glfw庫可以在它的官網上下載,提供了動態庫和靜態庫供選擇,也可以下載原始碼自己編譯。以官方下載的靜態庫glfw3.lib為

OpenGL學習繪製三角形

開發環境: MAC、xcode 上程式碼: 1.main.cpp // // main.cpp // GL_example // // Created by LiYong on 2018/2/28. // #include <

Problem C: 動態規劃基礎題目數字三角形

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the

C#繪製三角形以及旋轉

三角形類: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

初涉C#讀取txt檔案並繪製座標曲線圖

     這兩天由於各種原因,不得不迫使自己學些傍身的東西。所以開始找一些程式語言來武裝武裝自己。C#沒有C++那麼複雜,但也相對於VB要高階一些,或許是個不錯的選擇呢。這兩天看了下讀取文字資料的資料,也在網上查了各種繪製座標圖的方法。怎麼說呢,可能是自己領悟能力比較弱,進

C有趣-繪製餘弦曲線

當我一開始看到這個問題的時候,我頓時懵圈了(委屈)。敲了這麼多程式碼,我也算是閱程式碼數千的菜鳥了,如果被這個問題難住,那我以後在程式設計界還怎麼混啊!(雖然本來就混得不怎麼地)於是乎,聰明的我便尋到了

OpenGL ES2.0入門Android篇(一)——繪製三角形

OpenGL ES簡介 OpenGL ES是一個為行動式或嵌入式裝置例如:行動電話、監視器等發展的3D繪圖API。 在Android框架中有兩個基礎類用於使用OpenGL ES建立和處理圖形 GLSurfaceView類是OpenGL ES繪製圖形

百度2017春招筆試真題編程題集合尋找三角形

import math 可能 表示 tint blog 整數 angle printf 題目描述 三維空間中有N個點,每個點可能是三種顏色的其中之一,三種顏色分別是紅綠藍,分別用‘R‘, ‘G‘, ‘B‘表示。 現在要找出三個點,並組成一個三角形,使得這個三角形的面積最大。

C# 集合ArrayList

img 必須 () pac range tro 我們 list() 叠代 .NET Framework提供了用於數據存儲和檢索的專用類,這些類統稱集合。這些類提供對堆棧、隊列、列表和哈希表的支持。大多數集合類實現系統的接口。以下我們主要來講一下ArrayList。

C#自定義特性

創建 tip comm 字段 運算符 包含 自動 名稱 程序   在前面介紹的代碼中有使用特性,這些特性都是Microsoft定義好的,作為.NET Framework類庫的一部分,許多特性都得到了C#編譯器的支持。   .NET Frmework也允許定義自己的特性。自

C++Binary Heap/Max Heap

right pac col log parent this success ren ins 1 #include <iostream> 2 #include <time.h> 3 #include <random> 4

c++叠代器失效

個人 錯誤 自身 開始 崩潰 引用 重新 [0 但是 1.首先從一到題目開始談說起叠代器失效。有時我們很自然並且自信地 用下面方法刪除vector元素: #include <iostream>#include <stdio.h>#include

c++單例模式

lsi 但是 desc 模式 單例模式 ron spl 希望 構造函數 1 本篇主要討論下多線程下的單例模式實現:   首先是 double check 實現方式: 這種模式可以滿足多線程環境下,只產生一個實例。 template<typename T>

C#out修飾符、ref修飾符、params修飾符的簡單介紹

c# 一個 邏輯 本地 style 逗號 註意 可變 修飾 一、out修飾符   1、調用一個帶有輸出參數的方法也需要使用out 修飾符,但是作為輸出變量傳遞的本地變量在將他們作為輸出變量傳遞前不需要賦值(因為調用後會改變或丟失),編譯器允 許你傳遞未分

C#Console

copy 註意 組合 ext col 下一個 src sys 轉換 Console.Write 表示向控制臺直接寫入字符串,不進行換行,可繼續接著前面的字符寫入。Console.WriteLine 表示向控制臺寫入字符串後換行。Console.Read 表示從控制臺讀取

Objective-C成魔路【8-訪問成員變量和屬性】

order 線程安全 ring 內容 時間 targe 簡化 音樂 blank 郝萌主傾心貢獻,尊重作者的勞動成果。請勿轉載。 假設文章對您有所幫助,歡迎給作者捐贈,支持郝萌主,捐贈數額任意,重在心意^_^ 我要捐贈: 點擊捐贈 Cocos2d-X源代碼

【轉】c#繼承

none 實現 void 運算符重載 調用方法 需要 strong 靜態 顯式 一.繼承的類型   在面向對象的編程中,有兩種截然不同繼承類型:實現繼承和接口繼承   1.實現繼承和接口繼承   *實現繼承:表示一個類型派生於基類型,它擁有該基類型的所有成員字段和函

【轉】C#集合

tab 並發集合 get spa style con 都在 src 字典  數組(http://www.cnblogs.com/afei-24/p/6738128.html)的大小是固定的。如果元素的個數是動態的,就應使用集合類。     列表(http://www.cn

C++運算符重載

cells pro 運算符重載 似的 width uri erl wrap height C++ Code 1234567891011121314151617181920212223242526272829303132333435363738394041424