问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么在PS中画圆角矩形以及变换控件中的X,Y,W,H,H,V角度

发布网友 发布时间:2022-04-23 13:27

我来回答

2个回答

懂视网 时间:2022-05-11 19:46

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: Tangent = Opposite ÷ Adjacent

常用函数

我们制作的自定义控件都会用到下面这两个重要的函数(方法):

  • 一个函数接收角度和半径作为参数,返回围绕某个原点的相应点位置。(简单来说,就是把角度转换为点)

  • 一个完成相反的功能,以点(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; 
    }


    要注意的是首先我们需要把角度换算成弧度。一般来说,我们只需要在单位圆中进行研究:

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

    该函数已知角度和半径,利用三角函数,我们算出X和Y值,然后在加上给定的原点初始坐标即可。

    还应看到,函数代码中用到的是Y分量的负值,这是因为计算机显示器上网格是上下颠倒的(向下为正)。

    第二个函数的功能是把用户在控件上点击的点位置转换为相应的角度值。这稍稍麻烦点,因为我们不得不考虑添加一些东西。限于文章篇幅,我这里贴出部分代码:


    private float XYToDegrees(Point xy, Point origin) 
    { 
     double angle = 0.0; 
     if (xy.Y < origin.Y) 
     { 
     if (xy.X > 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.X) 
     { 
     //如此这般 
     } 
     } 
     else if (xy.Y > origin.Y) 
     { 
     //如此这般 
     } 
     if (angle > 180) angle -= 360; //控制角度范围 
     return (float)angle; 
    }


    该函数主要通过检查鼠标相对中心点的位置,确定其所在象限。一旦我们知道了象限,就可以利用三角函数(反正切)计算出角度。

    如果角度大于180度,则减去360度。这样就和Photoshop一样,把角度控制在-180度和180度之间。当然,这一步可以不做,不加这行代码控件一样能用。

    制作控件

    绘制控件

    这两个控件的背景相同:

  • 用宽度为2的Pen绘制外圈圆

  • 用40%(约100)不透明度的白色填充

  • 控件中心是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 < 0) alt = 0; 
     return alt; 
    }


    在Photoshop中,选择点(指鼠标点击点)在圆心时,高度为90,在边缘处则为0。这样,我们可以通过找到点击点到圆心距离和半径高度比值来计算出高度。然后,用90减去该值(实际上是按90到0来翻转一下)。

    自定义事件

    为了让我们的自定义控件更加专业,需要控件能够在数值发生变化时以编程方式进行提醒。这就是我们要设置事件的原因。

    例如,像这样给角度变化添加一个事件:


    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中文网!

    热心网友 时间:2022-05-11 16:54

    在工具箱里画矩形那个图表上,点住,会出现各种形状.第二个就是圆角矩形,画好后可以在上面的属性栏里调整圆角的大小. 圆角调整: 1.可以用选择工具之前设置“羽化”值,之后用“选择工具”画矩形框,出来的就是圆角矩形,之后可以进行“描边,但是比较麻烦。 2.滤镜下面的面换控件,拖拽成自己想要的样子。 里面的X,Y,W,H,角度,H,V是怎么一回事? X(水平位置)Y(垂直位置)W(宽度 )H(长度 )H(水平斜切)V(垂直斜切) 自由变换 “自由变换”命令可用于在一个连续的操作中应用变换(旋转、缩放、斜切、扭曲和透视)。也可以应用变形变换。不必选取其它命令,您只需在键盘上按住一个键,即可在变换类型之间进行切换。 注:如果您要变换某个形状或整个路径,“变换”命令将变为“变换路径”命令。如果您要变换多个路径段(而不是整个路径),“变换”命令将变为“变换点”命令。 1 选择要变换的对象。 2 执行下列操作之一: 选取“编辑”> “自由变换”。 如果您要变换选区、基于像素的图层或选区边界,请选取移动工具。然后在选项栏中选择“显示变换控件”。 如果您要变换矢量形状或路径,请选择路径选择工具。然后在选项栏中选择“显示变换控件”。 3 请执行下列一个或多个操作: 如果要通过拖动进行缩放,请拖动手柄。拖动角手柄时按住Shift键可按比例缩放。 要根据数字进行缩放,请在选项栏的“宽度”和“高度”文本框中输入百分比。单击“链接”图标以保持长宽比。 要通过拖动进行旋转,请将指针移到定界框之外(指针变为弯曲的双向箭头),然后拖动。按Shift键可将旋转*为按15度增量进行。 要根据数字进行旋转,请在选项栏的“旋转”文本框中输入度数。 要相对于外框的中心点扭曲,请按住Alt 键(Windows )或Option键(Mac OS)并拖动手柄。 要自由扭曲,请按住Ctrl键(Windows )或Command 键(Mac OS)并拖动手柄。 要斜切,请按住Ctrl+Shift组合键(Windows )或Command+Shift组合键(Mac OS)并拖动边手柄。当定位到边手柄上时,指针变为带一个小双向箭头的白色箭头。 如果要根据数字斜切,请在选项栏的H (水平斜切)和V (垂直斜切)文本框中输入角度。 要应用透视,请按住Ctrl+Alt+Shift组合键(Windows )或Command+Option+Shift组合键(Mac OS)并拖动角手柄。当放置在角手柄上方时,指针变为灰色箭头。 要变形,请单击选项栏中的“在自由变换和变形模式之间切换”按钮。拖动控制点以变换项目的形状,或从选项栏中的“变形”弹出式菜单中选取一种变形样式。从“变形”弹出式菜单中选取一种变形样式之后,可以使用方形手柄来调整变形的形状。 要更改参考点,请单击选项栏中参考点定位符上的方块。 要移动项目,请在选项栏的X (水平位置)和Y (垂直位置)文本框中输入参考点的新位置的值。单击“相关定位”按钮(三角状的按钮)可以相对于当前位置指定新位置。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    wps数据验证在哪里找到 电脑启动3d游戏就黑屏为什么我的电脑玩3D游戏的时候经常黑屏怎么... 电脑进行系统分级黑屏y管理3d设置在哪里 为什么杨梅不用洗 四川日丰管道MPP mpp电力管生产厂家一览表 电力mpp管品牌大全 电力mpp管知名品牌推荐【品牌库】 MPP电力管质量哪家比较好?陕西MPP电力管价格便宜吗? 品牌榜:2024年MPP电力管十大品牌排行榜 投票结果公布【新】 在线等:MPP电力管哪家卖的质量好 请问,宝宝体检要挂什么科? PS中,HSB 颜色模型 中的H S B分别代表哪个英语单词? 想带宝宝去检查,要挂什么科室 PS中,CTRL+H.快捷键是什么意思 PS里,Ctrl+H是什么的快捷健? 贷款后还款逾期会有什么后果? 请问怎么在ps看w和h的值呀~~就是图形的宽和长~急求在线等! PS CC中,我想放大看到像素块,可是ctrl+h键不管用是怎么回事,按显示里面也按不了 ps中,HSB颜色模式中的H表示什么,S表示什么,B表示什么 信用卡忘记还款逾期了怎么办? PS中HKSK印刷色是什么意思?HKSE是什么意思?PS设计用哪种颜色最真实? PS自由变换,没有H和V ps中ctrl+H出现了一个大框框,如何将那个大框框调小啊 PS中的拾色器H 、S 、B 、是什么意思? photoshop中,按住h键和鼠标会出现一个矩形框,矩形框太大了,怎么调小 555电路有什么用??? 如何让Macbook在闭合盖子时,系统不会休眠?? mac口红外壳是塑料的吗 mac口红盖里面有海绵吗 mac口红盖子里有海绵可以拿掉吗 三个月宝宝体检挂什么科 我想知道PS中取消(CTRL+D)和隐藏(CTRL+H)选区的内容,在图片效果上有什么不一样?请高手解答,谢谢 ps拾色器中的字母代表啥 小孩感冒发烧挂什么科 信用卡还款超期4天有什么后果? PS文填充字图层快捷键是什么? 宝宝不爱吃饭,挂什么科 ps的常用的技巧啊,不要那种一搜就能搜到的长篇的快捷键,详见补充_百度... 小孩不会说话挂什么科 小孩子肚子疼应该挂什么科呢? Adobe,photosh,PS软件修改相片怎么操作啊 小孩不怎么吃饭不怎么喝奶挂什么科 小孩发烧挂什么科,谢谢 5岁宝宝全身体检应该挂号挂什么科 宝宝3个半月大感冒咳嗽挂什么科? 儿童身高矮小挂什么科? 小孩咳嗽总不好挂什么科? 3岁半宝宝在儿保体检挂什么科 孩子两周岁了不爱说话 ,要挂什么科 60天宝宝生病挂什么科