Cómo encontrar la distancia mínima desde cada punto de un polígono hasta un punto determinado en gráficos por computadora
//Método de ajuste de volumen: crea el polígono convexo exterior más grande
//stdafx.h
#define PI 3.1415926
#define NULL 0
#define LEN sizeof(struct XYpoint)
long pointSum;
struct XYpoint
{
doble x;
doble y
estructura XYpoint *siguiente
};
XYpoint *creat(void) ) ;
struct XYpoint *insert(struct XYpoint *head2, struct XYpoint *p);
struct XYpoint *del(struct XYpoint *head, struct XYpoint *p); p >
estructura XYpoint *miny(struct XYpoint *head);
doble ángulo(struct XYpoint *a, struct XYpoint *b, struct XYpoint *c);
doble dis (struct XYpoint *a, struct XYpoint *b);
struct XYpoint *tank( struct XYpoint *head, struct XYpoint *head2);
struct XYpoint *convexHull( struct XYpoint * cabeza, estructura XYpoint *head2);
void print(struct XYpoint *head2);
//stdafx.cpp
#include "stdafx.h "
#include lt;math.hgt;
#include lt;vectorgt;
//usando el espacio de nombres std;
struct XYpoint *creat(void)
{
struct XYpoint *head
struct XYpoint *p1, *p2 ARCHIVO *; fp ;
if((fp=fopen("in_put.txt", "r"))==NULL)
{
printf("puede no abrir el archivo\n");
exit(0);
}
pointSum=0;
p1=p2 = (struct XYpoint *)malloc(LEN);
fscanf(fp, "lf, lf", amp; p1-gt; > head=NULL;
while(!feof (
fp))
{
pointSum=pointSum 1
if(pointSum==1)
head=p1; p> p>
else
p2-gt; next=p1;
p2=p1
p1=(struct XYpoint *)malloc( LEN) ;
fscanf(fp, "lf, lf", amp; p1-gt; x, amp; p1-gt; y
}
<); p> p2-gt; siguiente=NULL;fclose(fp);
return(cabeza); XYpoint * insertar(struct XYpoint *head2, struct XYpoint *p)
{
struct XYpoint *p1, *p0;
p0=p; p>
p1=cabeza2;
while(p1-gt;siguiente!=NULL)
{
p1=p1-gt;siguiente;
p>}
p1-gt; siguiente=p0
p0-gt; siguiente=NULL
if (head2; -gt; siguiente ==NULL)
printf("¡no se ha insertado!\n");
return (head2); >
struct XYpoint *del(struct XYpoint *head, struct XYpoint *p)
{
struct XYpoint *p0, *p1;
if (head== NULL)
{
printf("\nlist null\n");
ir al final
}
p0=cabeza;
while((p-gt;x!=p0-gt;x||p-gt;y!=p0-gt;y)amp; amp;p0- gt; siguiente!=NULL)
{
p1=p0
p0=p0-gt; p> }
if(p-gt; x==p0-gt; xamp; amp; p-gt; y==p0-gt; y)
{ p>
if(p0==cabeza)
cabeza=p0-gt;siguiente;
más
p1-gt;siguiente=p0- gt;siguiente;
}
más
> printf("¡no encontrado!\n");
end:
return (head);
}
estructura XYpoint *miny(struct XYpoint *head)
{
double min
struct XYpoint *p, *p1; =cabeza;
min=p-gt;y;
p1=p;
p=p-gt;siguiente;
while (p!=NULL)
{
if (mingt; p-gt; y)
{min=p-gt; =p;}
else if(min==p-gt;yamp;amp;p1-gt;xgt;p-gt;x)
{min=p-gt ;y, p1=p;}
else p=p-gt;siguiente;
}
return(p1);
}
ángulo doble(struct XYpoint *a, struct XYpoint *b, struct XYpoint *c)
{
struct XYpoint *p0, *p1, *p2;
doble dsx, dsy, dex, dey, cosfi, norma, fi
p0=a
p1=b; >
p2=c;
dsx=p1-gt;x-p0-gt;x;
dsy=p1-gt;y-p0-gt;y;
dex=p2-gt;x-p1-gt;x;
dey=p2-gt;y-p1-gt;y;
cosfi =dsx*dex dsy*dey;
norma=(dsx*dsx dsy*dsy)*(dex*dex dey*dey);
cosfi/=sqrt( norma );
fi=acos(cosfi);
if(cosfilt;=-1) fi=PI
if(cosfigt;=1) fi=0; ;
return(fi);
}
doble dis(struct XYpoint *a, struct XYpoint *b)
{
estructura XYpoint *p1, *p2;
doble dsx, dsy, dx
p1=a;
dsx=p2-gt;x-p1-gt;x;
dsy=p2-gt;y-p1-gt;y;
dx =sqrt(dsx*dsx dsy*dsy);
retorno(dx);
p>
}
struct XYpoint *tank( struct XYpoint *head, struct XYpoint *head2)
{
doble minfi, fi; p>
p>
doble dx, dy;
estructura XYpoint *p, *p1, *p2
p2=p=cabeza
;p1= cabeza2
minfi=PI;
mientras(p!=NULL)
{
dx=p -gt; x- p1-gt;x;
dy=p-gt;y-p1-gt;y;
if(dx!=0)
{
fi=atan(dy/dx);
if(filt; 0)
fi=fi PI
} p>
else if(dx==0amp;amp;dy==0) fi=PI;
else fi=PI/2.0;
if(minfigt;= fi)
{
minfi=fi=p
}
p=p-gt; ; siguiente;
p>
}
retorno (p2);
}
estructura XYpoint *convexHull( estructura XYpoint *head, struct XYpoint *head2) p>
{
double min
double tempAngle
struct XYpoint *lastP, *nowP; , *p, *p1, *p2;
p=cabeza;
ahoraP=p1=cabeza2
últimoP=ahoraP; p> p1=p1-gt; siguiente;
ahoraP=p1
mientras(p1-gt; siguiente!=NULL)
{
p1=p1-gt; siguiente
últimoP=ahoraP
ahoraP=p1
}
min; =ángulo(últimoP, ahoraP, p);
p2=p;
p=p-gt;
{
p>
tempAngle=ángulo(últimoP, ahoraP, p);
if (mingt; tempAngle)
{
min=t
empAngle;
p2=p;
p=p-gt; siguiente
}
else if(min==tempAngle )
{
if(dis(ahoraP, p2)lt; dis(ahoraP, p))
p2=p;
p=p-gt; siguiente;
}
más
{
p=p-gt; p>
p>
}
}
return(p2);
}
void print(struct XYpoint *head2)
{
ARCHIVO *fp;
struct XYpoint *p
p=head2;
if( (fp=fopen("out_put.txt","w"))==NULL)
{
printf("no se puede abrir el archivo\n ");
p>
exit(0);
}
fprintf(fp, "ld", pointSum);
fprintf(fp, "\n ");
mientras(p!=NULL)
{
fprintf(fp, "lf, lf ", p-gt; x, p- gt; y);
fprintf(fp, "\n");
p=p-gt; siguiente;
}
fclose(fp);
}
/*
int _tmain(int argc, _TCHAR* argv [])
{
struct XYpoint *head, *head2, *pp, *qq;
head=creat();
pp=miny(cabeza);
cabeza2=(struct XYpoint *)malloc(LEN
cabeza2-gt; x=pp-gt; >
cabeza2-gt; y= pp-gt;y;
cabeza2-gt;next=NULL;
pp=tanque(cabeza, cabeza2);
qq=(struct XYpoint * )malloc(LEN);
qq-gt; x=pp-gt;
qq-gt; gt; y;
qq-gt; siguiente=NULL
cabeza2=insertar(cabeza2, qq);
cabeza=del(cabeza, pp);
pp=convexHull(cabeza, cabeza2
hacer
{
qq=); (struct XYpoint *)malloc(LEN);
qq-gt; x=pp-gt; p>
qq-gt;
head2=insert; (cabeza2, qq);
cabeza=del(cabeza, pp);
pp=convexHull(cabeza, cabeza2);
}mientras(!( head2-gt;x==pp-gt;xamp;amp;head2-gt;y==pp-gt;y ));
print(head2); 0;
}
*/
/ /view.h
clase CCreateHullView: CView pública
{
privado:
int m_nPtnum;
XYpoint *m_pPtHead;
/p>
{
// TODO: agregue código de construcción aquí
m_nPtnum = 0;
m_pPtHead = NULL
m_pHullHead = NULL;
}
CCreateHullView::~CCreateHullView()
{
if (m_nPtnum gt; 0)
{
XYpoint *p = m_pPtHead;
while (NULL != p)
{
m_pPtHead = p-gt; p> p-gt; siguiente = NULL;
eliminar p;
p = m_pPtHead
}
m_pPtHead = NULL;
m_nPtnum = 0;
p = m_pHullHead
mientras (NULL != p)
p>{
m_pHullHead = p-gt; siguiente;
p-gt; siguiente = NULL
eliminar p;
p = m_pHullHead
}
m_pHullHead = NULL; /p>
void CCreateHullView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Agregue su código de controlador de mensajes aquí y/o llame a default p>
{
p>
if (0 == m_nPtnum)
{
m_pPtHead = nuevo punto XY;
m_pPtHead-gt; x = punto.x;
m_pPtHead-gt; y = punto.y
m_pPtHead-gt; > m_nPtnum;
}
p>
Punto XY *p = nuevo punto XY
p-gt; >
p-gt; y = punto.y;
p-gt; siguiente = m_pPtHead;
m_pPtHead = p; /p>
Invalidate();
CView ::OnLButtonDown(nFlags, punto);
}
void CCreateHullView::OnCreateHull()
{
// TODO: Añade aquí el código del controlador de comandos
if (0 lt; m_nPtnum)
{
struct XYpoint *head, *head2, *pp, *qq;
head = m_pPtHead
pp = miny(head
head2); =(struct XYpoint *)malloc(LEN);
head2-gt;x=pp-gt;x;
head2-gt;y=pp-gt;y;
head2-gt;next=NULL;
pp=tank(head, head2);
qq=(struct XYpoint *)malloc(LEN);
qq-gt; x=pp-gt;
qq-gt; y=pp-gt;
qq-gt; NULL;
cabeza2=insertar(cabeza2, qq);
cabeza=del(cabeza, pp);
pp=convexHull(cabeza, cabeza2
hacer
{
qq=(struct XYpoint *)malloc(LEN);
qq-gt; x=pp-gt;
qq-gt; ;
qq-gt; next=NULL;
head2=insert(head2, qq);
head=del(head, pp); p>
p>
pp=convexHull(cabeza, cabeza2);
} while(!(cabeza2-gt; x==pp-gt; xamp; amp; cabeza2-gt; y==pp-gt; y));
//print(cabeza2);
m_pHullHead = cabeza2
Invalidar(); >
}
}
void CCreateHullView::OnDraw(CDC* pDC)
{
CCreateHullDoc* pDoc = GetDocument ();
p>
ASSERT_VALID(pDoc);
// TODO: agregue código de dibujo para datos nativos aquí
XYpoint *p = NULL
if ( 0 lt; m_pHullHead)
{
p = m_pHullHead;
pDC-gt; (m_pHullHead-gt; x) - 2, (int)(m_pHullHead-gt; y) - 2, (int)(m_pHullHead-gt; x) 2, (int)(m_pHullHead-gt; y) 2 ); p>
pDC-gt; MoveTo ((int)(m_pHullHead-gt; x), (int)(m_pHullHead-gt; y));
p = m_pHullHead-gt; /p>
mientras (NULL ! = p)
{
pDC-gt;Rectangle(
(int)(p-gt;x ) - 2,
(int)(p-gt;y) - 2,
(int)(p-gt;x) 2,
(int)(p-gt;y) 2
pDC-gt; LineTo(CPoint((int)p-gt; x, (int)p-gt; y)); siguiente;
}
p = m_pHullHead
pDC-gt(CPoint((int)p-gt;x, (int)p-; gt;y));
}
p = m_pPtHead;
while (NULL != p)
{
pDC-gt;Rectángulo(
(int)(p-gt;x) - 2,
(int)(p-gt;y) - 2,
(int)(p-gt; x) 2,
(int)(p-gt; y) 2
);
//pDC-gt;FillSolidRect(
// (int)(p-gt;x) - 2,
// (int)(p-gt; y) - 2,
// (int)(p-gt; x) 2,
// (int)(p-gt; y) 2,
// RGB(225, 0, 0)
//
p = p-gt; p>
p>
}
Espero que funcione