WPF 極坐標簡單應用

来源:https://www.cnblogs.com/T-ARF/archive/2020/05/17/12903950.html
-Advertisement-
Play Games

在圓形佈局中說過極坐標。 極坐標是長度和邊與極軸之間的角度的坐標表示。 換句話說,只要知道角度和長度(與中心點的距離),我們就能求出這一點的坐標,相對的我們知道這個一點的XY坐標也能求出角度和長度。 極坐標的工具性真的很強,在繪圖,動畫上 有很大的幫助,計算過程要簡單不少。 下麵我給出一個簡單的小慄 ...


在圓形佈局中說過極坐標。

極坐標是長度和邊與極軸之間的角度的坐標表示。

換句話說,只要知道角度和長度(與中心點的距離),我們就能求出這一點的坐標,相對的我們知道這個一點的XY坐標也能求出角度和長度。

極坐標的工具性真的很強,在繪圖,動畫上 有很大的幫助,計算過程要簡單不少。

下麵我給出一個簡單的小慄子

截圖:

 

using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;

namespace 極坐標綜合應用
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private Line DrawLine;
        private bool IsDraw;
 
        private Line SetBaseLine() => new Line() {Stroke=new SolidColorBrush(Colors.Red),StrokeThickness=1.1 };
        private void C1_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if(e.LeftButton==MouseButtonState.Pressed)
            {
                c1.Children.Clear();
                IsDraw = true;
               
                DrawLine = SetBaseLine();
                DrawLine.X1 = e.GetPosition(c1).X;
                DrawLine.Y1 = e.GetPosition(c1).Y;
                DrawLine.X2 = e.GetPosition(c1).X;
                DrawLine.Y2 = e.GetPosition(c1).Y;
                c1.Children.Add(DrawLine);
            }
        }

        private void C1_MouseMove(object sender, MouseEventArgs e)
        {
            if(e.LeftButton==MouseButtonState.Pressed)
            if(IsDraw==true)
            {
                DrawLine.X2 = e.GetPosition(c1).X;
                DrawLine.Y2 = e.GetPosition(c1).Y;
            }
        }

        private void C1_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Released)
            {
                IsDraw = false;
                CoodSystem();
            }
        }

        private void CoodSystem()
        {
            var startpoint = new Point(DrawLine.X1, DrawLine.Y1);
            var enpoint = new Point(DrawLine.X2, DrawLine.Y2);
            //轉換為笛卡爾坐標
            var sub = Point.Subtract(enpoint, startpoint);
            var x = sub.X;
            var y = sub.Y;
            //轉換公式
            sub = new Vector(x, 0 - y);
            //求出tan
            var k = y / x;
            //轉換角度
            var angle = 180 / Math.PI * Math.Atan2(y, x);

            t1.Text = $"{(angle<=0?Math.Abs(angle):360-angle)}度";
        }

        double ToRandion(double angle) => angle * (Math.PI / 180);

        void Create(Line l1, double angle,double len)
        {
            //轉極坐標公式求X值
            var x = len * Math.Cos(ToRandion(angle));
            //轉極坐標公式求Y值
            var y = len * Math.Sin(ToRandion(angle));

            //笛卡爾轉屏幕坐標
            x =l1.X1 + x;
            y = l1.Y1 - y;

            l1.X2 = x;
            l1.Y2 = y;
        }

        Point GetMid() => new Point(c1.ActualWidth / 2, c1.ActualHeight / 2);

        private void T2_KeyDown(object sender, KeyEventArgs e)
        {
            var x =Convert.ToDouble( xt.Text);
            var y = Convert.ToDouble(yt.Text);
            var len = Convert.ToDouble(lt.Text);
            c1.Children.Clear();
            DrawLine = SetBaseLine();
            DrawLine.X1 = x;
            DrawLine.Y1 = y;
            Create(DrawLine, Convert.ToDouble(t2.Text),len);
            c1.Children.Add(DrawLine);
        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#硬體開發,一種是調用廠家提供的api;另一種就是通過com口,發送命令,和硬體通信。這2種方法,如果有硬體,業務流程很好調試。但是大部分硬體,只有和客戶聯調才會有硬體調試的機會。那業務流程沒有硬體,怎樣調試?一種是利用vs自帶的斷點跳過功能,這種方式慢,而且不同人調試都要加斷點,0效率低。另一種 ...
  • 上一篇:異常Exception(二) 使用try...catch...捕獲異常,如果能預料到某些異常可能發生,可以使用精確的異常例如“FileNotFoundException”、“DirectoryNotFoundException”、“IOException”等,最有使用一般異常“Excepti ...
  • 《ASP.NET MVC 5 編程實戰》 [作者] (美) Dino Esposito[譯者] (中) 潘麗臣[出版] 清華大學出版社[版次] 2015年03月 第1版[印次] 2015年03月 第1次 印刷[定價] 59.80元 【前言】 Web Forms 的最常見應用場景是,你要開發專註於呈現 ...
  • NuGet: Dapper 2.0.35 MySql.Data System.Data 實體(Entity) 1 public class student 2 { 3 public int Id { get; set; } 4 public string RealName { get; set; } ...
  • 上一篇文章(https://www.cnblogs.com/meowv/p/12896177.html)已經成功創建了博客項目,但是abp預設給我們引用了許多項目中用不到的組件。 本篇文章將給項目進行瘦身,刪掉對我們來說暫時用不到的組件。講解各個模塊之間的關係,寫一個Hello World,讓其成功 ...
  • 在上一篇,大概介紹了Entity Framework Core關於關係映射的邏輯。在上一篇中留下了EF的外鍵映射沒有說,也就是一對一,一對多,多對一,多對多的關係等。這一篇將為大家細細分析一下,如何設置這些映射。 1. 實體之間的關係 從數據表來考慮,兩個表之前的關係有一對一,一對多(多對一)和多對 ...
  • static void MockHeartBeatViaWhileTrue() { while (true) { Console.WriteLine($"Now is {DateTime.Now.ToString("yyyyMMddHHmmssffff")}"); Thread.Sleep(2000 ...
  • 目 錄 1. 概述... 2 2. 平臺演示... 2 3. 增加按鈕組態元件... 2 4. 組態圖元旋轉及動畫... 3 5. 後臺容器管理... 3 6. 重新啟動後臺iNeuKernel設備容器服務... 4 7. 重新載入後臺iNeuKernel設備容器配置... 5 8. 下發設備控制命 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...