Java 版本的图形算法

Java 版本的图形算法

简介

最近在工作中遇到了计算机图形学相关的问题,所以针对这些问题进行了一些整理。

计算机图形学教程

华中科技大学-计算机图形学教程

光线投射算法

光线投射算法可以判别单点是否在多边形区域中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import static java.lang.Math.*;

public class RayCasting {

static boolean intersects(int[] A, int[] B, double[] P) {
if (A[1] > B[1])
return intersects(B, A, P);

if (P[1] == A[1] || P[1] == B[1])
P[1] += 0.0001;

if (P[1] > B[1] || P[1] < A[1] || P[0] >= max(A[0], B[0]))
return false;

if (P[0] < min(A[0], B[0]))
return true;

double red = (P[1] - A[1]) / (double) (P[0] - A[0]);
double blue = (B[1] - A[1]) / (double) (B[0] - A[0]);
return red >= blue;
}

static boolean contains(int[][] shape, double[] pnt) {
boolean inside = false;
int len = shape.length;
for (int i = 0; i < len; i++) {
if (intersects(shape[i], shape[(i + 1) % len], pnt))
inside = !inside;
}
return inside;
}

public static void main(String[] a) {
double[][] testPoints = {{10, 10}, {10, 16}, {-20, 10}, {0, 10},
{20, 10}, {16, 10}, {20, 20}};

for (int[][] shape : shapes) {
for (double[] pnt : testPoints)
System.out.printf("%7s ", contains(shape, pnt));
System.out.println();
}
}

final static int[][] square = {{0, 0}, {20, 0}, {20, 20}, {0, 20}};

final static int[][] squareHole = {{0, 0}, {20, 0}, {20, 20}, {0, 20},
{5, 5}, {15, 5}, {15, 15}, {5, 15}};

final static int[][] strange = {{0, 0}, {5, 5}, {0, 20}, {5, 15}, {15, 15},
{20, 20}, {20, 0}};

final static int[][] hexagon = {{6, 0}, {14, 0}, {20, 10}, {14, 20},
{6, 20}, {0, 10}};

final static int[][][] shapes = {square, squareHole, strange, hexagon};
}

参考资料

多边形撒点算法

注:此章节中的参考资料都是前端代码

参考资料

使用四叉树撒点

参考资料


Java 版本的图形算法
https://wangqian0306.github.io/2022/java-graph/
作者
WangQian
发布于
2022年6月6日
许可协议