Red de conocimiento del abogados - Preguntas y respuestas sobre la Ley de patentes - Cómo encontrar la distancia mínima desde cada punto de un polígono hasta un punto determinado en gráficos por computadora

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);

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>

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;

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)

{

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>

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

}

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)

{

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>

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

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