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

📄 nearest.c

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


/*********************** self documentation **********************/
/*****************************************************************************
NEAREST - NEAREST edge or vertex in triangulated model

nearestEdgeInModel	Return pointer to edge in model nearest to
                    	specified (x,y) coordinates

nearestVertexInModel	Return pointer to vertex in model nearest
                   	to specified (x,y) coordinates

******************************************************************************
Function Prototypes:
Vertex* nearestVertexInModel (Model *m, Vertex *start, float x, float y);
Edge* nearestEdgeInModel (Model *m, Edge *start, float x, float y);

******************************************************************************
nearestEdgeInModel:
Input:
m		model
start		edge to look at first (NULL to begin looking anywhere)
x		x-coordinate
y		y-coordinate

Returns: pointer to nearest Edge

nearestVertexInModel:
Input:
m		model
start		vertex to look at first (NULL to begin looking anywhere)
x		x-coordinate
y		y-coordinate

Returns: pointer to nearest Vertex

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

#include "Triangles/triP.h"

Edge* nearestEdgeInModel (Model *m, Edge *start, float x, float y)
/*****************************************************************************
nearestEdgeInModel - Return pointer to edge in model nearest to
                     specified (x,y) coordinates
******************************************************************************
Input:
m		model
start		edge to look at first (NULL to begin looking anywhere)
x		x-coordinate
y		y-coordinate

Returns: pointer to nearest Edge

******************************************************************************
Author:  Dave Hale, Colorado School of Mines, 09/11/90
******************************************************************************/
{
	float d,dmin=0.0;
	Edge *emin=NULL;
	EdgeUse *eu;
	Tri *t;
	
	/* find triangle containing point */
	if (start!=NULL) {
		t = (start->eu->f!=NULL?start->eu->f:start->eu->euMate->f);
		t = insideTriInModel(m,t,x,y);
	} else {
		t = insideTriInModel(m,NULL,x,y);
	}
	
	/* loop over edges in triangle */
	eu = t->eu;
	do {
		
		/* compute distance to edge */
		d = distanceToEdge(eu->e,x,y);
		
		/* update minimum distance */
		if (eu==t->eu || d<dmin) {
			dmin = d;
			emin = eu->e;
		}
		
		/* next edge */
		eu = eu->euCW;
		
	} while (eu!=t->eu);
	
	/* return edge corresponding to minimum distance */
	return emin;
}

Vertex* nearestVertexInModel (Model *m, Vertex *start, float x, float y)
/*****************************************************************************
nearestVertexInModel - Return pointer to vertex in model nearest
                       to specified (x,y) coordinates
******************************************************************************
Input:
m		model
start		vertex to look at first (NULL to begin looking anywhere)
x		x-coordinate
y		y-coordinate

Returns: pointer to nearest Vertex

******************************************************************************
Author:  Dave Hale, Colorado School of Mines, 07/10/90
******************************************************************************/
{
	float dx,dy,ds,dsmin;
	Vertex *v,*vmin,*vn;
	VertexUse *vu;
	EdgeUse *eu;

	/* start at some vertex in model */
	vmin = (start==NULL ? m->f->eu->vu->v : start);
	dx = vmin->x-x;
	dy = vmin->y-y;
	dsmin = dx*dx+dy*dy;
	
	/* hop from vertex to vertex, always moving closer to (x,y) */
	do {
		v = vmin;
		vu = v->vu;
		do {
			eu = vu->eu;
			vn = eu->euCW->vu->v;
			dx = vn->x-x;
			dy = vn->y-y;
			ds = dx*dx+dy*dy;
			if (dsmin>ds) {
				dsmin = ds;
				vmin = vn;
			}
			vu = vu->vuNext;
		} while (vu!=v->vu);		
	} while (v!=vmin);
	
	return v;
}

⌨️ 快捷键说明

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