• Unity论坛问答-如何裁剪一个多边形


    原贴: Generate Polygons and Colliders Runtime in 2D Game

    这是有一个2017年的帖子, 题主siddharth3322有了一个游戏的创意, 然后在论坛征询一些实现方面的建议, 于是和Fido789一问一答持续了几个月.

    最后游戏上线了Google Play: Scale

    游戏的玩法如下:

    很明显需要在游戏过程中不断地创建多边形, 题主使用了一个叫做PolyMesh的代码来生成多边形.
    而这个组件需要按顺序提供各个顶点.
    于是有了一个问题, 如何按照顺序(如顺时针)排序各个顶点呢?

    题主参考了StackOverflow上的一个回答: Sort points in clockwise order?
    方法是首先找到多边形的中心点, 然后在排序中把比较方法设为:

    det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)


    注释中说这是计算向量Vca与向量Vcb的叉乘, 根据正负来判断顺序.
    也可以整理一下式子, 认为这是在比较斜率k.

    这个方法看起来很美好, 但是实际出现了问题:

    原始多边形如下图

    裁剪后希望变成下面绿色部分

    但实际上变成下面红色部分

    Fido789回答道: 你找的这个算法只能针对凸多边形, 但你应用在了凹多边形上.
    建议使用Clipper, 直接做一个多边形的A and not B操作就行.



    也许对这个应用来说可以有更轻量级的解法方法, 但是在性能不重要的情况下, 用Clipper不是很优雅么.

    看到国内有人翻译了Clipper的中文文档, 其中对Clipper的介绍如下:

     Clipper库是目前计算机图形届广为使用的图形处理库,可以用于解决平面二维图形的多边形简化、布尔运算和偏置处理,
    在CAD、加工路径与3D打印方面都有着比较重要的应用。

  • 相关阅读:
    EA教程 (四) SQLHelper类
    详解包含、扩展和泛化
    几种常用的单例模式详解
    我的分层
    EA教程(二)数据库
    软件版本号如何定义
    精解PV操作之信号量
    eclipse连接数据库驱动汇总
    [Leetcode 17] 13 Roman to Integer
    Short term goal for 2013 rest time
  • 原文地址:https://www.cnblogs.com/yusjoel/p/13278840.html
Copyright © 2020-2023  润新知