📄 tripoint.c
字号:
/* Generating Random Points in Trianglesby Greg Turkfrom "Graphics Gems", Academic Press, 1990*/#include <math.h>#include "GGems.h"/*****************************************************************Compute relative areas of sub-triangles that form a convex polygon.There are vcount-2 sub-triangles, each defined by the first pointin the polygon and two other adjacent points.This procedure should be called once before using square_to_polygon().Entry: vertices - list of the vertices of a convex polygon vcount - number of vertices of polygonExit: areas - relative areas of sub-triangles of polygon*******************************************************************/triangle_areas (vertices, vcount, areas) Point3 vertices[]; int vcount; float areas[];{ int i; float area_sum = 0; Vector3 v1,v2,v3; /* compute relative areas of the sub-triangles of polygon */ for (i = 0; i < vcount - 2; i++) { V3Sub(&vertices[i+1], &vertices[0], &v1); V3Sub(&vertices[i+2], &vertices[0], &v2); V3Cross(&v1, &v2, &v3); areas[i] = V3Length(&v3); area_sum += areas[i]; } /* normalize areas so that the sum of all sub-triangles is one */ for (i = 0; i < vcount - 2; i++) areas[i] /= area_sum;}/******************************************************************Map a point from the square [0,1] x [0,1] into a convex polygon.Uniform random points in the square will generate uniform random points in the polygon.The procedure triangle_areas() must be called once to compute 'areas', and then this procedure can be called repeatedly.Entry: vertices - list of the vertices of a convex polygon vcount - number of vertices of polygon areas - relative areas of sub-triangles of polygon s,t - position in the square [0,1] x [0,1]Exit: p - position in polygon*********************************************************************/square_to_polygon (vertices, vcount, areas, s, t, p) Point3 vertices[]; int vcount; float areas[]; float s,t; Point3 *p;{ int i; float area_sum = 0; float a,b,c; /* use 's' to pick one sub-triangle, weighted by relative */ /* area of triangles */ for (i = 0; i < vcount - 2; i++) { area_sum += areas[i]; if (area_sum >= s) break; } /* map 's' into the interval [0,1] */ s = (s - area_sum + areas[i]) / areas[i]; /* map (s,t) to a point in that sub-triangle */ t = sqrt(t); a = 1 - t; b = (1 - s) * t; c = s * t; p->x = a * vertices[0].x + b * vertices[i+1].x + c * vertices[i+2].x; p->y = a * vertices[0].y + b * vertices[i+1].y + c * vertices[i+2].y; p->z = a * vertices[0].z + b * vertices[i+1].z + c * vertices[i+2].z;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -