图形大小_PS图形复制——等距复制、旋转复制、大小变换复制

PS中图形复制是很常见的事,可能不同人的习惯可能会用不同的方法。这里糖糖主要讲的是图形的一些等距复制、旋转复制、大小变换旋转复制,相信看过本篇文章之后你也可以通过图形的不同需要的复制做一些很不错的图案哦~

da4dda49c1b9afa2242c5565381fb270.png

糖糖先在PS里用钢笔工具绘制了一个绿叶,下面多数以此为例,当然大家可以使用自己需要的不同形状来做练习~

9b51e4fa77e0bc76aaaabf70dd49798c.png

按alt键拖动图形可复制

要注意使用选择工具的时候,顶部属性栏要勾选“自动选择”,那样鼠标放到哪个图形上就会自动选择哪个图层。

大家可以把鼠标放到叶子上,同时按alt键会看到鼠标变成一个黑色箭头下面是一个白色箭头,这就代表复制的意思,可以拖动叶子图形移动到任何地方,就等于移动复制了一层,如下:

5e254c02b6a8eea1d3ae6d9d2e79b8bb.png

复制的时候按shift+alt,可以水平或垂直复制对齐图形

如果想要平行移动复制的话,按alt复制的时候不松手同时也要按shift,即可强制水平对齐或垂直复制对齐第一个图形。

糖糖觉得叶子图形平行复制可能显示效果不明显,下面就用圆角矩形形状为例子,在水平和垂直方向都做了移动复制。

具体可以打开标尺拉辅助线,根据辅助线就可以明显的看出:垂直方向和水平方向的移动复制都是对齐第一个图形的。

146610b8e4aa78f6f45d544840926e0c.png

等距离水平复制和偏移复制

有了上面的基础,下面做等距离复制图形就会更容易理解了,下面还以绘制的叶子为例。

先绘制叶子图形,接下来执行自由变换,快捷键ctrl+T,然后随意移动位置后确定即可。

978a569e531533839347262deed61750.png

最后三键ctrl+shift+alt+T进行叶子形状的再制,多执行几次三键+T,是偏移复制的效果,如下:

d6f47cef9eaca24fa320d8ad48e869d1.png

由于自由变换移动叶子的时候是自由移动的,没有按shift进行强制水平方向的移动,所以多次三键+T后的效果上面看起来就是偏移复制且等距离的。

若要水平方向等距离移动复制,自由变换移动的时候要按shift,最终结果复制出来就是水平对齐且等距离的,如下:

5fccf1945276ac60208a3bb97729b05d.png

这里是水平移动复制的,垂直方向的移动等距离复制方法也是一样的哟~

旋转复制

其实旋转复制和水平复制方法是一样的。选择叶子图形,自由变换ctrl+T,按alt键可以移动叶子的中心点至合适的地方,如下图:

0972fdbc73d4c7c09e0cfcac5ab25a75.png

此时自由变换顶部属性栏有个旋转的属性,可以根据需要输入旋转的数值参数,这里糖糖暂且就随便输入了15度进行旋转,如下:

36293b3c2a45caa05f6ffcde9c2e1d60.png

角度由你的需要选择设置哦,最后三键ctrl+shift+alt+T进行再制,多执行几步直到自己需要的结果,糖糖的图形旋转复制结果如下:

d37a965e7aee554be431f68a73625365.png

旋转缩小、放大复制

其实同旋转复制方法也是一样的,不过旋转的同时要做放大或缩小的命令而已。

对叶子执行自由变换ctrl+T,按shift适当等比例缩小叶子,同时按alt移动中心点,设置旋转数值。

20f054ec2115351b12f6a487f359a240.png

接下来三键+T,然后多执行几步再制的命令,效果如下:

a342e1b522d053b75912a9167bb99306.png

水平方向缩小复制也是可以的,当然放大也是可以的,这个主要根据需要来操作。

cf4202ee1d84267b714bc5a80534567e.png

通过上面一些复制,相信大家都了解了PS中图形的水平或垂直等距离复制、旋转复制的操作,其他的主要掌握方法可以自己根据需要灵活运用就好。

大家可以用线条、图形描边也都是可以的,不同的旋转角度也会有不同的效果,大家可以玩起来哦~

59e6279da3f87c73ca38bf69e9c94590.png
### 计算机图形学中使用MFC进行几何变换和裁剪 #### 使用MFC实现基本的几何变换 在计算机图形学领域,几何变换是指通过数学运算改变物体的位置、大小或方向。常见的几何变换包括平移、缩放、旋转等操作。这些变换可以通过矩阵乘法来表示并应用于二维或三维空间中的对象。 对于基于Microsoft Foundation Classes (MFC)框架开发的应用程序来说,可以利用Windows GDI(Graphics Device Interface)提供的API来进行绘图以及执行上述提到的各种几何变化。具体而言: - **创建设备上下文**:为了能够在窗口上绘画,首先需要获取一个指向CDC类的对象实例,该对象封装了GDI的功能。 - **定义变换矩阵**:接着要构建一个描述所需变换类型的XFORM结构体,并调用`SetWorldTransform()`函数将其设置给当前DC。 下面是一个简单的例子展示如何在一个矩形周围画圆圈的同时对其进行旋转变换[^1]: ```cpp void CMyView::OnDraw(CDC* pDC) { CPen pen(PS_SOLID, 2, RGB(0, 0, 255)); CPen *pOldPen = pDC->SelectObject(&pen); XFORM xForm; float angleInRadians = 45.0f; // Rotation Angle in Radians // Define rotation matrix elements based on the given angle. xForm.eM11 = cos(angleInRadians); xForm.eM12 = sin(angleInRadians); xForm.eM21 = -sin(angleInRadians); xForm.eM22 = cos(angleInRadians); xForm.eDx = 0.0f; xForm.eDy = 0.0f; pDC->SetWorldTransform(&xForm); CRect rect(50, 50, 150, 150); pDC->Ellipse(rect); pDC->ModifyWorldTransform(NULL, MWT_IDENTITY); // Reset transformation. pDC->SelectObject(pOldPen); } ``` 这段代码展示了怎样围绕中心点顺时针旋转90度后绘制椭圆形区域的效果。这里的关键在于设置了世界坐标系下的仿射变换参数并通过`SetWorldTransform()`应用到了整个视图范围内。 #### 实现多边形裁剪算法 当涉及到复杂形状如规则多边形时,则需要用到专门设计用来解决这类问题的技术——即所谓的“裁剪”。 一种常用的方法叫做Sutherland-Hodgman算法,它可以有效地处理任意凸凹多边形与矩形窗口之间的交集计算过程。此方法的核心思想是逐条边地测试每个多边形顶点是否位于指定区域内;如果在则按照一定规则调整端点直至满足条件为止。 以下是采用C++/MFC编写的简化版Sutherland-Hodgman裁剪器的部分源码片段[^2]: ```cpp // Function to clip a polygon against an edge of clipping window std::vector<CPoint> ClipPolygon(const std::vector<CPoint>& poly, const CRect& win, int edgeIndex) { std::vector<CPoint> outputList{poly.front()}; for(size_t i=0 ;i<poly.size()-1;i++) { auto pt1=poly[i]; auto pt2=poly[(i+1)%poly.size()]; bool inside1 = IsInside(pt1,win,edgeIndex), inside2 = IsInside(pt2,win,edgeIndex); if(inside1 && !inside2){ outputList.push_back(GetIntersection(win,pt1,pt2,edgeIndex)); } else if(!inside1 && inside2){ outputList.push_back(GetIntersection(win,pt1,pt2,edgeIndex)); outputList.push_back(pt2); }else if(inside1 && inside2){ outputList.push_back(pt2); } } return outputList; } bool IsInside(const CPoint &point,const CRect &rect,int edgeIdx) { switch(edgeIdx) { case LEFT_EDGE :return point.x >= rect.left;break; case RIGHT_EDGE:return point.x <= rect.right;break; case BOTTOM_EDGE:return point.y >= rect.bottom;break; case TOP_EDGE :return point.y <= rect.top;break; } return false; } CPoint GetIntersection(const CRect &clipWin,CPoint startPt,CPoint endPt,int edgeIdx) { double m=(endPt.y-startPt.y)/(double)(endPt.x-startPt.x); double b=startPt.y-m*startPt.x; int intersectX=-1,intersectY=-1; switch(edgeIdx) { case LEFT_EDGE : intersectX=clipWin.left; intersectY=m*intersectX+b; break; case RIGHT_EDGE: intersectX=clipWin.right; intersectY=m*intersectX+b; break; case TOP_EDGE : intersectY=clipWin.top; intersectX=(intersectY-b)/m; break; case BOTTOM_EDGE: intersectY=clipWin.bottom; intersectX=(intersectY-b)/m; break; } return CPoint(intersectX,intersectY); } ``` 以上实现了针对单一边界(左、右、底、顶部之一)对输入多边形进行裁减的过程。完整的解决方案还需要依次遍历四个边界并将最终结果返回给调用者。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值