⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colinear.c

📁 该程序主要用于三角网
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2001.*/
/* All rights reserved.                       */

/*********************** self documentation **********************/
/******************************************************************************
COLINEAR - determine if edges or vertecies are COLINEAR in triangulated
           model
edgesColinear		see whether or not two edges are colinear
vertexBetweenVertices	determine whether or not a vertex is on a line
                          between two other vertices
*******************************************************************************
Function Prototypes:
int edgesColinear (Edge *e1, Edge *e2);
int vertexBetweenVertices (Vertex *v, Vertex *v1, Vertex *v2);

*******************************************************************************
edgesColinear:
Input:
e1	pointer to first Edge
e2	pointer to second Edge

Returns: (int)
1	if colinear

vertexBetweenVertices:
Input:
v		pointer to first Vertex in question
v1		pointer to first reference Vertex
v2		pointer to second reference Vertex

Returns: integer
1		if v=v1 or v=v2 or if v is between v1 and v2
0		otherwise

*******************************************************************************
Author:  Dave Hale, Colorado School of Mines, Fall 1990.
******************************************************************************/
/**************** end self doc ********************************/

#include "Triangles/triP.h"

int edgesColinear (Edge *e1, Edge *e2)
/******************************************************************************
edgesColinear - see whether or not two edges are colinear
*******************************************************************************
Input:
e1	pointer to first Edge
e2	pointer to second Edge

Returns: (int)
1	if colinear
0	if not colinear

*******************************************************************************
Author:  Dave Hale, Colorado School of Mines, 07/10/90
******************************************************************************/
{
	float xa,xb,ya,yb,x1,x2,y1,y2,c12,a1,a2,s12;

	/* edge vectors */
	xa = e1->eu->vu->v->x;  xb = e1->eu->euCW->vu->v->x;
	ya = e1->eu->vu->v->y;  yb = e1->eu->euCW->vu->v->y;
	x1 = xb-xa;
	y1 = yb-ya;
	xa = e2->eu->vu->v->x;  xb = e2->eu->euCW->vu->v->x;
	ya = e2->eu->vu->v->y;  yb = e2->eu->euCW->vu->v->y;
	x2 = xb-xa;
	y2 = yb-ya;
	
	/* cross-product of vectors 1 and 2 */
	c12 = x1*y2-x2*y1;
	
	/* magnitude-squared of x1 and x2 */
	a1 = x1*x1+y1*y1;
	a2 = x2*x2+y2*y2;
	
	/* sin-squared of angle between vectors 1 and 2 */
	s12 = (c12*c12)/(a1*a2);
	
	/* if sin-squared less than tiny number, then colinear */
	if (s12<0.0001)
		return 1;
	else
		return 0;
}

int vertexBetweenVertices (Vertex *v, Vertex *v1, Vertex *v2)
/*****************************************************************************
vertexBetweenVertices - determine whether or not a vertex is on a line
                        between two other vertices
******************************************************************************
Input:
v		pointer to first Vertex in question
v1		pointer to first reference Vertex
v2		pointer to second reference Vertex

Returns: integer
1		if v=v1 or v=v2 or if v is between v1 and v2
0		otherwise

******************************************************************************
Author: Dave Hale, Center for Wave Phenomena, c. 1990 1991.
*****************************************************************************/
{
	float xa,xb,ya,yb,x1,x2,y1,y2,x12,y12,a1,a2,a12,c,s1,s2,d1,d2;

	/* vectors 1, 2, and 12 */
	xa = v1->x;  xb = v->x;  x1 = xb-xa;
	ya = v1->y;  yb = v->y;  y1 = yb-ya;
	xa = v2->x;  xb = v->x;  x2 = xb-xa;
	ya = v2->y;  yb = v->y;  y2 = yb-ya;
	xa = v1->x;  xb = v2->x;  x12 = xb-xa;
	ya = v1->y;  yb = v2->y;  y12 = yb-ya;
	
	/* magnitude-squared of vectors */
	a1 = x1*x1+y1*y1;
	a2 = x2*x2+y2*y2;
	a12 = x12*x12+y12*y12;
	
	/* handle case where v equals v1 or v2 */
	if (a1==0.0 || a2==0.0) return 1;
	
	/* handle case where v1 equals v2 */
	if (a12==0.0) return 0;
	
	/* test sign of product of (1 dot 12) and (2 dot 12) */
	d1 = x1*x12+y1*y12;
	d2 = x2*x12+y2*y12;
	if (d1*d2>0.0) return 0;
	
	/* test sin-squared of angle between vectors 1 and 12 */
	c = x1*y12-x12*y1;
	s1 = (c*c)/(a1*a12);
	if (s1>0.0001) return 0;
	
	/* test sin-squared of angle between vectors 2 and 12 */
	c = x2*y12-x12*y2;
	s2 = (c*c)/(a2*a12);
	if (s2>0.0001) return 0;
	
	/* if passed all the checks, then v is on line between v1 and v2 */
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -