c数据结构,如何在vb中调用???

ediex 2007-01-25 03:18:23
c语言的凸包Graham算法,本人不懂vb另外我发现计算点超过了10个,程序好像就运行出错,这是为什么?
最近搞个这个散点计算程序,都晕死了
程序在vc6下调的
是以动态链接库dll形式,给vb调用,请问如何在vb中调用??

谢了
#include <math.h>
#include <stdlib.h>
#define infinity 1e20
#define EP 1e-10

typedef struct {
float x,y;
}TPoint;


/* 返回(P1-P0)*(P2-P0)的叉积。*/
float multiply(TPoint p1,TPoint p2,TPoint p0)
{
return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}


/* 求平面上两点之间的距离 */
float distance(TPoint p1,TPoint p2)
{
return((float)sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}


/*
寻找凸包 graham 扫描法

PointSet为输入的点集;
ch为输出的凸包上的点集,按照逆时针方向排列;
n为PointSet中的点的数目
len为输出的凸包上的点的个数;
*/
void Graham_scan(TPoint PointSet[],TPoint ch[],int n,int len)
{
int i,j,k=0,top=2;
TPoint tmp;

/*选取PointSet中y坐标最小的点PointSet[k],如果这样的点右多个,则取最左边的一个 */
for(i=1;i<n;i++)
if ((PointSet[i].y<PointSet[k].y)||((PointSet[i].y==PointSet[k].y)&&(PointSet[i].x<PointSet[k].x)))
k=i;
tmp=PointSet[0];
PointSet[0]=PointSet[k];
PointSet[k]=tmp; /*现在PointSet中y坐标最小的点在PointSet[0] */
for (i=1;i<n-1;i++) /*对顶点按照相对PointSet[0]的极角从小到大进行排序,极角相同的按照距离PointSet[0]从近到远进行排序 */
{ k=i;
for (j=i+1;j<n;j++)
if ( (multiply(PointSet[j],PointSet[k],PointSet[0])>0)
||
( (multiply(PointSet[j],PointSet[k],PointSet[0])==0)
&&(distance(PointSet[0],PointSet[j])<distance(PointSet[0],PointSet[k])) )
) k=j;
tmp=PointSet[i];
PointSet[i]=PointSet[k];
PointSet[k]=tmp;
}

/* 以上的代码将点集按照逆时针排序 */

ch[0]=PointSet[0];
ch[1]=PointSet[1];
ch[2]=PointSet[2];
for (i=3;i<n;i++)
{
while (multiply(PointSet[i],ch[top],ch[top-1])>=0) top--;
ch[++top]=PointSet[i];
}
len=top+1;
}

void EXPORTFORDLL Graham(int intDataXY[],int intTuBao[],int intDataLong)
{
TPoint *my_point;
TPoint *border_point;
int i;
my_point=(TPoint *)malloc(intDataLong*sizeof(TPoint));
border_point=(TPoint *)malloc(intDataLong*sizeof(TPoint));
for ( i=0; i<= intDataLong-1;i++)
{
//intDataXY[i]=intDataXY[i]+intDataXY[i];
//intDataXY[i+intDataLong]=intDataXY[i+intDataLong]+intDataXY[i+intDataLong];
my_point[i].x=(float)intDataXY[i];
my_point[i].y=(float)intDataXY[i+intDataLong];
}
Graham_scan(my_point,border_point,intDataLong,intDataLong);

for(i=0;i<intDataLong-1;i++)
{
intTuBao[i]=(int)border_point[i].x;
intTuBao[i+intDataLong+1]=(int)border_point[i].y;
}
free(my_point);
free(border_point);

}
...全文
142 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
FigoZhu 2007-12-05
  • 打赏
  • 举报
回复
帮顶,接分

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧