我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光栅化

        • 基础
        • 边界判定
          • 4. 边界判定
            • 4.1 边界函数(Edge Function)
            • 4.2 判定三角形内外
            • 4.3 判定三角形的边(Top-Left规则)
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

边界判定


4. 边界判定

4.1 边界函数(Edge Function)

设二维平面上的一条直线,上面有两个点P0(x0,y0)和P1(x1,y1),这里假设直线的方向是从P0到P1,那么直线把整个二维平面分成两部分,“左边”和“右边”。那么对于这个平面上任意一点P(x,y),定义二维函数

e(x,y)=∥P0P1→×P0P→∥=(x1−x0)(y−y0)−(y1−y0)(x−x0)

称这个函数为这条直线的边界函数(Edge Function),当e(x,y)>0时,P位于直线的左侧,当e(x,y)<0时,P位于直线的右侧,当e(x,y)=0时,表示P恰好在直线上

4.2 判定三角形内外

对于逆时针排列三角形,如果一个点如果在三角形内,那么这个点一定在所有三条边的“左侧”,反之,只要有这个点出现在任意一条边的“右侧”,那么这个点就是在三角形的外部

4.3 判定三角形的边(Top-Left规则)

如果一个点出恰好现在三角形某个边上,也就是某个EdgeFunction的值恰好为零,需要根据Top-Left规则来判定这个点是否归属改三角形。 这是由于图形学中会出现两个三角形共享一条边的情况,而这种情况下边上的点应该只归属其中一个三角形,Top-Left是一个约定的规则:

如果边出现三角形左侧或者恰好是水平方向最上面的边,则这种边属于这个三角形

例如上面的三角形,实线边是属于这个三角形的,虚线边则不属于。 DirectX的光栅化规则也是遵守的这个规则

如果一个点是两个边的公有点,则只有在这两条边都是属于三角形的边的情况下,这个顶点才是属于这个三角形的,以保证在光栅化过程中,所有点都属于唯一的某个三角形,例如下面的一个比较极端的例子,对8个小三角形的光栅化

Prev
基础