首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何做正确的多边形旋转?(在C#中,虽然它适用于任何东西)

在C#中,要实现正确的多边形旋转,可以按照以下步骤进行操作:

  1. 定义多边形的顶点坐标:使用一个数组或列表来存储多边形的顶点坐标。每个顶点都由其x和y坐标表示。
  2. 计算多边形的中心点:遍历多边形的所有顶点,将它们的x和y坐标相加并分别除以顶点数量,得到多边形的中心点坐标。
  3. 将多边形的顶点坐标转换为相对于中心点的坐标:遍历多边形的所有顶点,将每个顶点的x坐标减去中心点的x坐标,将每个顶点的y坐标减去中心点的y坐标。这样可以将多边形的中心点移动到坐标原点。
  4. 应用旋转变换:使用旋转矩阵来对多边形进行旋转。旋转矩阵的计算公式如下:x' = x * cos(theta) - y * sin(theta) y' = x * sin(theta) + y * cos(theta)其中,x和y是相对于中心点的顶点坐标,x'和y'是旋转后的顶点坐标,theta是旋转角度。
  5. 将旋转后的顶点坐标转换回原始坐标系:遍历旋转后的顶点坐标,将每个顶点的x坐标加上中心点的x坐标,将每个顶点的y坐标加上中心点的y坐标。这样可以将多边形移回原始坐标系。

以下是一个示例代码,演示了如何在C#中实现多边形旋转:

代码语言:csharp
复制
using System;

class Program
{
    static void Main(string[] args)
    {
        // 定义多边形的顶点坐标
        int[] x = { 0, 1, 1, 0 };
        int[] y = { 0, 0, 1, 1 };

        // 计算多边形的中心点
        int centerX = 0, centerY = 0;
        for (int i = 0; i < x.Length; i++)
        {
            centerX += x[i];
            centerY += y[i];
        }
        centerX /= x.Length;
        centerY /= y.Length;

        // 将顶点坐标转换为相对于中心点的坐标
        for (int i = 0; i < x.Length; i++)
        {
            x[i] -= centerX;
            y[i] -= centerY;
        }

        // 定义旋转角度(以弧度为单位)
        double angle = Math.PI / 4; // 45度

        // 应用旋转变换
        for (int i = 0; i < x.Length; i++)
        {
            int newX = (int)(x[i] * Math.Cos(angle) - y[i] * Math.Sin(angle));
            int newY = (int)(x[i] * Math.Sin(angle) + y[i] * Math.Cos(angle));
            x[i] = newX;
            y[i] = newY;
        }

        // 将顶点坐标转换回原始坐标系
        for (int i = 0; i < x.Length; i++)
        {
            x[i] += centerX;
            y[i] += centerY;
        }

        // 输出旋转后的多边形顶点坐标
        for (int i = 0; i < x.Length; i++)
        {
            Console.WriteLine("顶点 {0}: ({1}, {2})", i + 1, x[i], y[i]);
        }
    }
}

这段代码演示了如何使用C#实现多边形的旋转。你可以根据实际需求进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你必须知道webgl基础

矩阵 矩阵虽然有很多种,其中一种叫做方阵。就是行数和列数相同矩阵。 ? 一般3D渲染世界中使用是4x4矩阵。...矩阵可以将上面提到变换保存起来,比如,如果是模型变换矩阵,想要绘制3D模型位置,扩大缩小,以及旋转等信息,都可以定义一个矩阵。...视图变换矩阵,镜头位置,镜头方向,以及镜头对准了哪个点(注视点)等可以定义一个矩阵。投影变换矩阵的话,显示横竖比例和视角等信息可以定义一个矩阵。...也就是说,操作坐标变换矩阵,就可以决定模型画面上如何绘制。 4. webgl可描述东西 要说WebGL世界里能够描画什么,其实任何东西都可以描画。而描画最基本东西就是下面几种。...但是一般浏览器如果遇到不识别的标签的话会无视掉,浏览器不会认为这是javascript代码。浏览器只会把当成无意义字符串,而程序则可以使用标签里面的内容。

1.3K11

模拟试题C

( ) A)平移变换不改变图形大小和形状,只改变图形位置; B)错切变换虽然可引起图形角度改变,但不会发生图形畸变; C)旋转变换后各图形部分间线性关系和角度关系不变,变换后直线长度不变...7.多边形扫描转换,计算扫描线与多边形顶点相交时,按上开下闭原则,对于该奇点记数,下述哪一叙述是正确( ) A)当射线与多边形交于某顶点时且该点两个邻边在射线上方时,计数0次; B)...在三维旋转变换,关于x轴旋转π/2时变换特点描述正确是( ) A)y′= –z B)y′= z C)y坐标不变 D) x、y、z坐标都不变 13....3.下列有关Bezier曲线性质叙述正确结论为( ) A)Bezier曲线可用其特征多边形定义; B)Bezier曲线必须通过其特征多边形各个顶点; C)Bezier曲线两端点处切线方向必须与其特征多边形相应两端线段走向一致...4.各种消隐算法,下列哪些论述是正确

2K30
  • 使用 C# Graphics 绘图来绘制一个足球

    虽然不看球,不过这波热度持续冲击,还是让我朋友圈刷到了结局 ———— 球王梅西如愿以偿捧得金杯,后起之秀姆巴佩加冕金靴。但作为程序员,为了增加一些参与感我就拿 C# 画个足球图案吧。...Graphics 介绍 图案绘制方法非常简单,使用 C# System.Drawing 命名空间中 Graphics 类方法即可在窗体、控件、图像或其他绘图表面上绘制文本、线条、图像和其他图形...足球绘制 使用 DrawPolygon 方法绘制多边形,我们可以简单绘制一个足球图案。绘制足球就要绘制五边形,或者六边形。...,就需要根据五边形继续计算五个六边形坐标,这样就非常麻烦了,经过几番尝试后,我找到了一种比较简单绘制足球方法:首先绘制一个六边形,然后选择一个外部圆心对这个六边形坐标进行旋转 72 度,这样旋转几次...然后画五边形代码前面加画一个填充黑色大圆,足球就这样画好了: // 获取绘图对象 Graphics g = this.CreateGraphics(); int width = 100; //

    60920

    【CSS】305- Web 使用 CSS Shapes 艺术设计

    第一个设计,我不需要绘制多边形以使内容两侧三角形形状之间流动;相反,我只需要指定图像文件 URL 作为 shape-outside 值: [src*="shape-left"],[src*="...图像必须与产品或网站托管同一个域里。如果你使用 CDN,请确保发送正确标头以启用形状。值得注意是,本地测试形状唯一方法是使用 Web 服务器。 file:// 协议根本不起作用。...弯曲型 CSS Shapes 最迷人一个方面是如何使用部分透明图像 alpha 通道创建优雅形状。这种形状可以是我想象到任何东西。我只需要创建一个图像,浏览器将会在周围流动内容。...虽然 CSS Shapes 模块 2 级规范 已经提出将内容限制形状内,但目前无法知道是否以及何时可以浏览器实现。...有些几年前难以想象布局,现在只要再引入 Transforms 就能做出来了。最后一个例子,要做到围绕图像汽车流动文本,同时旋转整个布局,需要这些属性所有组合。 ?

    1.2K20

    这些小图标原来是这样做

    很多设计师设计时候,大多都是直接复制已有的图片设计,下面就利用一些动图,和大家简单分享一下这些小图标是如何做。 图片较多,建议wifi观看! ?...沙漏图标,靠近中心移动点是通过锚点工具完成。 ? 骷髅图标,钢笔工具、锚点工具和布尔运算绘制完成。 ? 磁铁图标,通过复制对象来切割末端, 使得笔画变粗,勾出笔画,最后,布尔运算操作完成。 ?...手柄缺口是用多边形工具创建 (4边多边形是正方形!)。 ? 雨伞图标,布尔运算完成。 ? 风扇图标,路径选择工具和布尔运算完成。 ? 牛角面包图标。...将矩形旋转至-120º或120º, 然后固定到点,布尔运算进行完成。 ? 钢笔工具,布尔运算和路径选择工具完成。 ? 锚点工具和布尔运算进行完成。 ?...耳机图标,通过双击旋转工具并键入特定值(10º和-10º)完成耳罩旋转。 ? 游戏控制器,布尔运算和路径选择工具完成。 ? 胡须图标,钢笔工具、锚点工具和宽度工具完成。

    73120

    SQL2008空间数据类型--欧氏几何2类与方法

    2  类与方法 在上一篇博客说道了几何数据类型(点、线、面和集合)定义,既然几何数据类型是通过CLR来扩展出来,学习过C#都知道,一个对象下面会有属性和方法,那么几何数据类型对应也有其属性和方法...该表取自OGC官方文档,SQL2008使用时函数名前面有ST前缀。...()方法 InstanceOf 确定几何图形是否为给定实例类型,其实就相当于C#is关键字。...比如SELECT @g.InstanceOf('GEOMETRYCOLLECTION'); STIsValid 确定几何图形实例对其实例类型而言格式是否正确,有些申明虽然符合语法但是不符合OGC规定...相当于C#[n] MultiCurve类方法: STIsClosed 确定实例是否闭合,也就是起点和终点相同。

    78720

    你被追尾了

    例如我们想实现一个小球如下盒子内移动,移动过程如果碰到边界就反弹(假定弹性碰撞,无机械能损失). ? 那么我们只需要在小球外接一个正方形,然后判定该正方形和边框是否发生碰撞就行了....其实上面将熊猫(竹子)离屏数据渲染出来只是为了效果直观一些,实际运用过程,肯定不会将这些离屏数据屏幕上渲染出来,而是在内存中使用,因为内存操作这些数据肯定远比屏幕上渲染出这些数据快多....这就是上述 getAxes 函数 投影(project) 通过将一个多边形每个顶点与原点(0,0)组成向量,投影某一投影轴上,然后维护该多边形该投影轴上所有投影最大值和最小值,这样即可表示一个多边形某投影轴上投影了...注意,从投影过程,我们就能看出为什么 SAT 定理只能针对凸多边形有效,因为凸多边形有一个凹多边形不具备性质.就是凸多边形任何一条边同侧,而凹多边形可能在某条边异侧....显然,分离轴算法适用于圆形、凸多边形之间碰撞检测. 还是有一定价值. 关于 SAT 定理,还有更为优秀 GJK 碰撞检测算法. GJK 比 SAT 更适用于推广到 3D 场景.

    4.6K30

    模拟试题B

    多边形逐边裁剪法,对于某条多边形边(方向为从端点S到端点P)与某条裁剪线(窗口某一边)比较结果共有以下四种情况,如图B.9所示,分别需输出一些顶点.请问哪种情况下输出顶点是错误?...5.下面算法,属于图像空间消隐算法有 ( ) A)深度缓存算法(Z-Buffer) B)扫描线深度缓存消隐算法 C)画家算法 D)光线跟踪算法 6.多边形填充时,下述哪些论述是正确?...( ) A)多边形被两条扫描线分割成许多梯形,梯形底边在扫描线上,腰多边形边上,并且相间排列; B)多边形与某扫描线相交得到偶数个交点,这些交点间构成线段分别在多边形内、外,且相间排列;...C)用射线法判断点是否多边形内时,若该射线与多边形交点数目为偶数即可认为多边形内部,若为奇数则在多边形外部,而且不需考虑任何特殊情况; D)边连贯性表明,多边形某条边与当前扫描线相交时...,可互换有( ) A)比例、比例 B)平移、平移 C)旋转旋转 D)比例(a=b)、平移 E)比例(a=b)、旋转 F)旋转、平移 13.下列三维基本变换类型,能以坐标轴为变换参考对象

    4.2K10

    Unity2D手册翻译(三)

    图3:Sprite Editor 和复合图片在一起,你会看到在窗口顶端工具条里面有一批控件。右上方控件区滑动条,彩色工具栏按钮左边那个,可以选择你是否看到图片本身,或者是透明度。...Deleting existing 选项会无论什么已经选择了,都简单替换掉, Smart 会在保留或调整现有的矩形时,尝试建立一个新矩形,而 Safe 会增加一个新矩形,完全不改变已经存在那里任何东西...修改多边形大小 打开多边形 Sprite Editor,你可以获得修改形状、尺寸和中心点位置选项。 Shape ?...(注意你不能直接编辑 Border 格子内容) PIVOT:修改躲避新安县中心点(多边形旋转轴点),点击图片显示Sprite信息盒。点击 Pivot 下拉菜单,然后选择一个选项。...这会显示一个蓝色中线点圆圈多边形上;位置依赖你选择中心点选项。如果你想将来修改,选择 Custom Pivot 然后点击并拖动蓝色中心点圆圈到想要位置上。

    2K40

    ODTK:来自NVIDIA旋转框物体检测工具箱

    需要使用精确分析解决方案来最大化效率和准确性。 为了解决这个问题,我们转向几何方法,顺序切割是一种递归方法,使用一个比较框定义初始多边形。对于每条边,计算与第二个被比较框边是否有交集。...然后,IoU通过分割多边形区域来计算,正如前面计算框和锚区域IoU。 与与之对应轴对齐方法相比,这种递归方法更加复杂。但是,与光栅化框和锚相比,计算要求更少,也不那么麻烦。...然后,将框逆时针旋转theta 弧度,本例为-0.209。如果旋转方框包含了图片框之外区域,没有关系。 ?...这确保安装了正确版本PyTorch和其他先决条件。...你会发现直接训练,验证,实施,并提供模型服务,最大话GPU资源效率。并持续为高性能,端到端掩模训练和推理,多边形检测,和高效多目标跟踪集成进行调优。 ?

    2.9K30

    Unity基础系列(四)——构造分形(递归实现细节)

    本教程,我们将编写一个小C#脚本,让完成一些类似分形行为。 这里假设你已经能够了解一些Unity基本操作,并且能够创建基本C#脚本了。...标准漫射着色器使用单一颜色和可选纹理,结合场景光源,来确定多边形外观。这里使用是稍微复杂镜面着色器,同时模拟了一个亮点。...这就是为什么Unity在他们默认脚本模板包含,以及为什么本示例一开始也包括原因。...这样做减少了CPU和GPU之间通信量。 你可以通过 Edit/Projects Settings/Player/, Other Settings 启用或禁用它。 适用于小网格。...比如,你会发现适用于Unity默认立方体,但不适用于默认球面。 导致这个结果问题是,因为调整子节点材质颜色,Unity默默地创造了一个复制材质。

    1.9K10

    CASIA: 支持检测、分割、关键点标注工具

    CASIA标注工具是由我独立开发,下载地址:https://github.com/msnh2012/CasiaLabeler 软件介绍 CasiaLabeler是一款非常轻量标注软件,支持win10...主要适用于目标检测和实例分割等场景。可用于Faster RCNN, Mask RCNN, Yolo系列, SSD系列, Centernet系列等。...特殊说明 工程路径不能带有空格!...快捷键 绘制矩形: D 绘制多边形: p 绘制线段: L 绘制点: T 绘制贝塞尔曲线: B 绘制贝塞尔区域: Alt+B 插入点: Alt+T 旋转图形: R 新建工程: Ctrl+N 打开工程: Ctrl...如有BUG,可以issue里面进行评论,虽然我也不一定会立即修复BUG(只有晚上才有时间啦~),不过有时间了还是会修复。欢迎来Github点Star。

    2.3K20

    六方孔几种加工工艺

    依据以上规律,我们可测得从位置1到位置2每1°距离,并且该距离数据往复运动过程是一致。...该工艺一般适用于对边尺寸20以内,硬度值HB260以下产品,且往往孔底会存留残余材料,若规格增大,硬度增高,该工艺不能直接加工,需要先钻内切圆,然后用数控加工中心将各角去除余量剩余至1mm,然后再用旋转拉刀加工...,不仅生产成本增加,而且刀具损耗较高,并不能适用于汽轮机相关大规格六方孔螺母批量加工。...5、插削加工工艺 插削加工是插刀相对工件往复直线运动,工件做进给运动加工形成多边形孔,适用于通孔和盲孔加工,插削效率和精度不高,不适合批量生产,适合单件或小批量生产加工。...6、瓦特钻加工工艺 瓦特钻也称方孔钻,是通过勒洛三角形原理用旋转多刃刀具切割多边形孔,需要具备多边形钻头、钻模、钻头夹具三种工具,适合于铸铁、铸铜等脆性材料上钻削精度不高方孔,且需要根据加工孔规格确定钻模尺寸

    1.4K30

    为什么Python这么慢?

    然而,并没有赢得任何速度奖牌。 ? 就速度而言,Java与C或c++或c#或Python相比如何? 答案很大程度上取决于您正在运行应用程序类型。...Jython没有GIL,因为JythonPython线程由Java线程表示,并且受益于JVM内存管理系统。 JavaScript是如何做到这一点?...这不仅适用于脚本,还适用于您导入所有代码,包括第三方模块。 所以大多数时候(除非您编写代码只运行一次?),Python都是解释字节码并在本地执行。...那么,如果Python都使用虚拟机和某种字节码,那么为什么基准测试它比Java和c#慢那么多呢? 首先,. net和Java是jit编译。...CPython插入JIT是有可能,但是这个项目很大程度上已经停止了。如果您希望获得JIT好处,并且有适合工作负载,那么可以使用PyPy。 3.

    1.5K20

    仅用5000行代码,V853上AI渲染出一亿幅山水画

    一种容易想到方法是让山都生成一根直线附近。 另一种方法是生成首尾相连折线段,用这些折线段作为山轮廓。 也可以先用多边形限制山生成范围,然后多边形内放置线段,用于生成山脉。...那随机生成树木又是如何做到棵棵都不一样呢,这里就有可能使用到了渲染编程数值奇异值分解原理了(不代表作者源码是基于该原理随机生成)。 奇异值分解表达如下: 其中A 是原矩阵。...V 和 U都是旋转矩阵,Sigma 是对角矩阵,代表伸缩矩阵。网上资料很多,这里不解释。 这里仅仅讨论物理意义。...蓝色轴和黄色轴即为本次矩阵变化,变化最为明显向量。 注意向量并不局限于边,三角形内任意一段向量都可以,端点不固定,方向不固定。只是说蓝色向量,黄色向量在此次矩阵变换,变长或变短程度最大。...作者本人对中华文化也是颇有研究,除了山水画之外,之前也曾开发过一款文言文编程语言,该语言中他用《易经》阴和阳代表布尔变量0和1,感兴趣同学也可以去探索一下此语言蕴含中华文字之美。

    13810

    Unity基础教程-物体运动(十一)——滚动(Animated Sphere)

    为球Transform组件添加一个配置选项到MovingSphere,并在Awake获得MeshRenderer。然后预置连接引用。 ? ?...2.3 运动 为了使球滚动,我们必须旋转,使表面运动与它运动相匹配。最简单完美情况是一个球一条直线上滚动。每个时刻,球表面只有一个点接触地面。...(球半径) 我们常规每帧更新期间(UpdateBall)使球滚动,因为纯粹是视觉效果。但是球体物理步长中会移动,因此如果帧频足够高,我们可能会在两者之间发生线性运动。...(空中和游泳旋转速度) 我们通过UpdateBall旋转因子缩放角度来调整旋转速度。默认情况下为1,但是游泳或不接触任何东西时,我们应使用适当配置速度。 ? ?...(不同滚动速度) 3.4 移动表面滚动 使我们正确滚动最后一步是使它与移动表面相结合。现在,球继承了被连接物体运动,从而没法正确进行滚动了。 ?

    3.2K30

    粗略物体碰撞预测及检测

    碰撞检测问题也是游戏开发中经常遇到问题,一个游戏场景可能存在很多物体,它们之间大多属于较远位置或者相对无关状态,那么一个物体碰撞运算没必要遍历这些物体,我们可以使用一个包围一个或多个物体多边形来讨论碰撞问题...AABB包围盒与OBB包围盒最直接区别就是,AABB包围盒是不可以旋转,而OBB包围盒是可以旋转,也就是有向。   ...三维场景物体AABB包围盒是一个六面体,虽然有8个顶点,但是对于规则AABB立方体,我们仅需要知道两个顶点(xmin,ymin,zmin)和(xmax,ymax,zmax)就可以得到AABB中心点...当物体在场景中移动时,AABB也需要随之移动,当物体发生旋转时,有两种选择:用变换后物体来重新计算AABB,或者对AABB做和物体同样变换。...其中,通过求取垂直物体运动方向上宽度就可以得到包络线宽度,可以应用旋转方法。   AABB碰撞检测算法虽然计算方法简单,速度快,但是仅适用于精度要求不高场合

    2.7K81

    这些年我开源几个小项目

    ,主要功能就是用来手动绘制多边形,一般用于图片上进行标注: 这个项目来源于工作上需求,记得那时刚入职新公司不久,就来了一个要在图片上绘制多边形需求,这种显然是要用svg或canvas来实现,虽然这两个东西之前基本都没有用过...做这个项目的过程也有一些小收获,一个是解决了自己之前一个疑惑,怎么判断鼠标是否点击到了一个多边形,实现其实就是绘制和多边形同样路径,然后通过isPointInPath()方法来判断一个点是否在当前路径...,笔者已经有点记不清了,应该是笔者使用百度脑图时候意外发现了它是开源,然后就准备看看源码,但是发现这个项目已经4年多没更新了,并且代码组织方式笔者不是很喜欢,重要是看不懂,另外也发现市面上有很多在线思维导图产品...2.选中多个图形,同时进行旋转,目前没有思考出很好实现方式,像是自由书写和折线这些图形是没有问题,因为旋转就是旋转构成它们每一个点,但是其他图形渲染不是通过一个个点,而是通过位置宽高之类共同确定...,所以没办法旋转图形上点。

    65020

    粗略物体碰撞预测及检测

    碰撞检测问题也是游戏开发中经常遇到问题,一个游戏场景可能存在很多物体,它们之间大多属于较远位置或者相对无关状态,那么一个物体碰撞运算没必要遍历这些物体,我们可以使用一个包围一个或多个物体多边形来讨论碰撞问题...真实物理系统,一般需要在运算速度和精确性上做取舍。...三维场景物体AABB包围盒是一个六面体,虽然有8个顶点,但是对于规则AABB立方体,我们仅需要知道两个顶点(xmin,ymin,zmin</sub...当物体在场景中移动时,AABB也需要随之移动,当物体发生旋转时,有两种选择:用变换后物体来重新计算AABB,或者对AABB做和物体同样变换。...其中,通过求取垂直物体运动方向上宽度就可以得到包络线宽度,可以应用旋转方法。   AABB碰撞检测算法虽然计算方法简单,速度快,但是仅适用于精度要求不高场合

    1.9K60
    领券