搜尋
首頁web前端PS教程Photoshop樣式的角度和高度選擇器控件

Photoshop样式的角度和高度选择器控件

Photoshop样式的角度和高度选择器控件

簡介

Adobe Photoshop有兩個非常專業的用來設定如投影、斜面與浮雕等特效的控制:一個是角度選擇器,另一個是角度與高度選擇器(如上圖所選擇器(如上圖所用示)。

本文將帶領讀者創建兩個自訂控件,來模仿Photoshop中這兩個控件的外觀和行為。

基礎知識-數學

畢達哥拉斯定理

(即勾股定理,為尊重原文,以下簡稱畢氏定理。儘管有點繞口。-野比註)

利用畢氏定理,我們可以計算直角三角形的斜邊(最長邊)。計算公式為Photoshop样式的角度和高度选择器控件 。這樣,斜邊c就等於Photoshop样式的角度和高度选择器控件

單位圓

鑑於接下來的工作和角度及圓有關,我們先熟悉一下單位圓的形式是很有好處的。單位圓就是以(0,0)為圓心,半徑為1的圓。在常規網格(指畫布-野比注)中,0度(的座標)從(1,0)這點(右)開始,以逆時針方向增加。因此,90度是(0,1),180度是(-1,0),270度是(0,-1),最後360度和0點重合。

三角函數

這裡我們只需要知道三個基本的三角函數:sin、cos和tan(正弦、餘弦和正切——野比注)。如果我們還記得SOH-CAH-TOA(譯註+)的話,我們就知道,(直角)三角形的正弦等於對邊比上斜邊,餘弦等於鄰邊比上斜邊,正切等於對邊比上鄰邊。

同樣,我們知道反三角函數用來計算未知角度。

譯註+:

SOH-CAH-TOA是老外用來記憶三角函數的口訣。其中:O為opposite(對邊),H為Hypotenuse(斜邊),A為Adjacent(鄰邊)。

SOH:  Sine = Opposite ÷ Hypotenuse

CAH:  Cosine = Adjacent ÷ Hypotenuse

TOA: 銫下面這兩個重要的函數(方法): 

一個函數接收角度和半徑作為參數,傳回圍繞某個原點的對應點位置。 (簡單來說,就是把角度轉換為點)

  • 一個完成相反的功能,以點(X, Y)作為參數,找到最匹配的角度。

  • 第一個函數要簡單一點:

private PointF DegreesToXY(float degrees, float radius, Point origin)  
{  
  PointF xy = new PointF();  
  double radians = degrees * Math.PI / 180.0;  
  xy.X = (float)Math.Cos(radians) * radius + origin.X;  
  xy.Y = (float)Math.Sin(-radians) * radius + origin.Y;  
  return xy;  
}


 要注意的是首先我們需要把角度換算成弧度。一般來說,我們只需要在單位圓中進行研究:


該函數已知角度和半徑,利用三角函數,我們算出X和Y值,然後在加上給定的原點初始座標即可。

Photoshop样式的角度和高度选择器控件 也應看到,函數程式碼中用到的是Y分量的負值,這是因為電腦顯示器上網格是上下顛倒的(向下為正)。

第二個函數的功能是把使用者在控制項上點選的點位置轉換成對應的角度值。這稍微麻煩點,因為我們不得不考慮添加一些東西。限於文章篇幅,我在這裡貼出部分代碼:

private float XYToDegrees(Point xy, Point origin)  
{  
  double angle = 0.0;  
  if (xy.Y  origin.X)  
    {  
      angle = (double)(xy.X - origin.X) / (double)(origin.Y - xy.Y);  
      angle = Math.Atan(angle);  
      angle = 90.0 - angle * 180.0 / Math.PI;  
    }  
    else if (xy.X  origin.Y)  
  {  
    //如此这般  
  }  
  if (angle > 180) angle -= 360; //控制角度范围  
  return (float)angle;  
}


該函數主要透過檢查滑鼠相對中心點的位置,確定其所在像限。一旦我們知道了象限,就可以利用三角函數(反正切)來計算角度。 


如果角度大於180度,則減去360度。這樣就跟Photoshop一樣,把角度控制在-180度和180度之間。當然,這一步可以不做,不加這行程式碼控制項一樣能用。

製作控制

繪製控制

這兩個控制的背景相同: 

用寬度為2的Pen繪製外圈圓

  • 用寬度為2的Pen繪製外圈圓

  • 用40%(約1000%)

  • 控制中心是3x3像素的正方形

protected override void OnPaint(PaintEventArgs e)  
{  
  //...  
  
  //Draw  
  g.SmoothingMode = SmoothingMode.AntiAlias;  
  g.DrawEllipse(outline, drawRegion);  
  g.FillEllipse(fill, drawRegion);  
  
  //...光标 
  
  g.SmoothingMode = SmoothingMode.HighSpeed;   
  g.FillRectangle(Brushes.Black, originSquare);  
  
  //...  
}

注意SmoothMode属性。在绘制圆圈时将该属性设置为AntiAlias(抗锯齿),这样看起来既光滑又专业。但是如果画正方形时也用抗锯齿,就会显得模糊难看,所以将SmoothMode设置为HighSpeed(高速),这样画出的正方形边缘整齐犀利。 

根据控件不同,光标也有不同绘制方法。角度选择器比较简单,只需要从圆心到DegreesToXY函数返回的点连一条直线即可。角度与高度选择器则是在这点上绘制一个1x1的矩形,然后在周围绘制一个十字型光标。

处理用户点击

多亏我们有了XYToDegrees函数,处理用户点击变得特别简单。为了让我们的控件用起来和Photoshop一模一样,我们需要设置MouseDown和MouseMove事件。这样,各项数值将实时更新。这里是一个附注函数的代码:


private int findNearestAngle(Point mouseXY)  
{  
  int thisAngle = (int)XYToDegrees(mouseXY, origin);  
  if (thisAngle != 0)  
    return thisAngle;  
  else  
    return -1;  
}


 高度控件需要额外的处理,就是找到中心点和鼠标点击点的距离:


private int findAltitude(Point mouseXY)  
{  
  float distance = getDistance(mouseXY, origin);  
  int alt = 90 - (int)(90.0f * (distance / origin.X));  
  if (alt <p><br></p><p> 在Photoshop中,选择点(指鼠标点击点)在圆心时,高度为90,在边缘处则为0。这样,我们可以通过找到点击点到圆心距离和半径高度比值来计算出高度。然后,用90减去该值(实际上是按90到0来翻转一下)。</p><p>自定义事件</p><p>为了让我们的自定义控件更加专业,需要控件能够在数值发生变化时以编程方式进行提醒。这就是我们要设置事件的原因。</p><p>例如,像这样给角度变化添加一个事件:</p><p><br></p><pre class="brush:php;toolbar:false">public delegate void AngleChangedDelegate();  
public event AngleChangedDelegate AngleChanged;


然后,我们要做的就是每次变更Angle属性时,调用AngleChanged()(需要先判断是否为null)。

限制与改进

闪烁

没有闪烁!只需要在制作控件时设置DoubleBuffered属性为true,.NET Framework 2.0会处理剩下的工作,保证控件能流畅的重绘。

尺寸

因为控件使用基于半径(圆)的数学计算方法,因此需要保证控件的长度和宽度相等。

颜色

我是照着Photoshop的样子来的,所以并没包含背景颜色、外圈颜色这些属性。但是,浏览下代码,你会发现改成你喜欢的颜色或者让颜色可以动态修改并不是什么难事。

结论

我建议你下载项目文件(或者至少下载DEMO),这样你可以看到这俩控件用起来很爽。

协议

本文及有关代码、程序均基于CPOL(Codeproject Open License)协议。

更多Photoshop样式的角度和高度选择器控件 相关文章请关注PHP中文网!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
訪問Photoshop:方法和可用性訪問Photoshop:方法和可用性Apr 24, 2025 am 12:07 AM

可以通過購買永久許可證或訂閱CreativeCloud兩種方式獲取Photoshop。 1.購買永久許可證適合長期使用,無需每月支付,但無法享受最新更新。 2.訂閱CreativeCloud可訪問最新版本及其他Adobe軟件,需持續支付月費或年費。選擇應基於使用頻率和需求。

Photoshop最有用的是:常見任務和項目Photoshop最有用的是:常見任務和項目Apr 23, 2025 am 12:06 AM

Photoshop擅長圖像編輯、圖層和蒙版、數字繪畫及多種設計應用。 1)圖像編輯與修復:去除瑕疵,調整色彩和亮度。 2)圖層與蒙版:非破壞性編輯和創作。 3)數字繪畫與插圖:創作藝術作品。 4)實際應用:平面設計、網頁設計和數字藝術創作。

使用Photoshop:創意可能性和實際用途使用Photoshop:創意可能性和實際用途Apr 22, 2025 am 12:09 AM

Photoshop在實際應用中非常實用且具有創造性。 1)它提供基本編輯、修復和合成功能,適合初學者和專業人士。 2)高級功能如內容識別填充和圖層樣式可提升圖像效果。 3)掌握快捷鍵和優化圖層結構能提高工作效率。

Photoshop:高級技術和工具Photoshop:高級技術和工具Apr 21, 2025 am 12:08 AM

AdobePhotoshop的高級功能包括高級選擇工具、圖層混合模式和動作與腳本。 1)高級選擇工具如快速選擇工具和色彩範圍選擇工具可精確選擇圖像區域。 2)圖層混合模式如“疊加”模式能創造獨特視覺效果。 3)動作和腳本能自動化重複任務,提高工作效率。

Photoshop的主要功能:修飾和增強Photoshop的主要功能:修飾和增強Apr 20, 2025 am 12:07 AM

Photoshop在修圖和增強方面的強大功能包括:1.使用“修復畫筆工具”去除痘痘,2.使用“液化工具”瘦臉,3.使用“頻率分離”技術進行精確修圖,這些功能通過算法和圖像處理技術實現,優化圖像處理效果。

Photoshop的主要特徵:深度潛水Photoshop的主要特徵:深度潛水Apr 19, 2025 am 12:08 AM

Photoshop的關鍵功能包括圖層與蒙版、調整工具、濾鏡與效果。 1.圖層與蒙版允許獨立編輯圖像部分。 2.調整工具如亮度/對比度可修改圖像色調和亮度。 3.濾鏡與效果可快速添加視覺效果。掌握這些功能可以幫助創意專業人士實現創意願景。

Photoshop和數字藝術:繪畫,插圖和合成Photoshop和數字藝術:繪畫,插圖和合成Apr 18, 2025 am 12:01 AM

Photoshop在數字藝術中的應用包括繪畫、插圖和圖像合成。 1)繪畫:使用畫筆、鉛筆和混合工具,藝術家可創造逼真效果。 2)插圖:通過矢量和形狀工具,藝術家可精確繪製複雜圖形並添加效果。 3)合成:利用蒙版和圖層混合模式,藝術家可將不同圖像元素無縫融合。

高級Photoshop教程:大師修飾和合成高級Photoshop教程:大師修飾和合成Apr 17, 2025 am 12:10 AM

Photoshop的高級修圖與合成技術包括:1.使用圖層、蒙版和調整層進行基礎操作;2.通過調整圖像像素值實現修圖效果;3.利用多圖層和蒙版進行複雜合成;4.應用“液化”工具調整面部特徵;5.使用“頻率分離”技術進行細膩修圖,這些技術能提升圖像處理水平並實現專業級效果。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。