| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3394 人关注过本帖
标题:如何用C语言解出多条线段的交点坐标?求大师赐教!
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用宇宙规律在2014-5-9 12:40:48的发言:

我已经开始做了,写好了再贴出来,让大家指导

好~

授人以渔,不授人以鱼。
2014-05-09 12:41
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
请问各位高手,if(a[i]*b[j]-a[j]*b[i]!=0) 在如下程序中,是什么限制条件,起什么作用呢?


(一)问题2001年第10期擂台赛的问题是: 给定n条线段,请编一程序,给出所有的交点坐标。
(二)一般解法该问题的解决并不难: 遍历该组线段中的任意一对求出交点即可。具体两线段交点的求法为:(1)先对应两线段分别对它们所在的直线写出相应的两点式方程,即设一线段两端点坐标分别为(xi,yi)与(xj,yj),则对应直线方程为: (y-yi)/(x-xi)=(y-yj)/(x-xj);(2)求两直线交点坐标,即联合两直线方程得一个一元二次方程组,求解之;(3)如方程组有解,判断解是否在两线段的两端点之间或端点上。是则方程组之解即是两线段的交点;否则两线段无交点。当然,在求两线段交点前还可以用一些条件式加以过滤,如对两线段所对应矩形无相交部分的情况,可直接判断两线段无交点等等。
(三)编程实例参赛程序有许多采用了上述方法,这里选载一个比较典型的程序设计
/* 程序说明
程序中的几个变量:
*x1棗线段初始点横坐标*y1棗线段初始点纵坐标
*x2棗线段终止点横坐标*y2棗线段终止点纵坐标
*a棗线段所在直线解析式中x项系数*b棗线段所在直线解析式中y项系数
*c棗线段所在直线解析式中常数项jx棗两条线段所在直线交点横坐标
jy棗两条线段所在直线交点纵坐标程序结构:
读出变量, 分配内存。用解析几何中计算两直线交点的公式两两计算两条线段所在直线交点。
用函数between判断两条线段所在直线交点是否
在线段上,若是,则输出结果。*/
#include <stdio.h>
#include <stdlib.h>
// 此函数判断交点坐标是否在线段坐标范围内,即判断交点是否落在线段上
int between(float u, float v, float w)
{ float max,min;
  max=(v>w)?v:w;
  min=(v<w)?v:w;
  return ((u<=max&&u>=min)?1:0);
}
int main()
{
  int n,i,j,num; //n为线段条数
  float x1[100],y1[100],x2[100],y2[100],a[100],b[100],c[100],jx,jy;
  while(scanf("%d",&n)&&n!=0)
  {   
   num=0;   
   for(i=0;i<n;++i)
   { scanf("%f%f%f%f",&x1[i],&y1[i],&x2[i],&y2[i]);
     if(x1[i]==x2[i])
     {
       a[i]=1;b[i]=0;c[i]=-x1[i];
     }
     else
     {
       a[i]=(y2[i]-y1[i])/(x1[i]-x2[i]);b[i]=1;
       c[i]=(x1[i]*y2[i]-x2[i]*y1[i])/(x2[i]-x1[i]);
     }
   }
   for(i=0;i<n;++i)
   {
      for(j=i+1;j<n;++j)
      {
         if(a[i]*b[j]-a[j]*b[i]!=0)
        {
          jx=(b[i]*c[j]-b[j]*c[i])/(a[i]*b[j]-a[j]*b[i]);
          jy=(c[i]*a[j]-c[j]*a[i])/(a[i]*b[j]-a[j]*b[i]);
          if(between(jx,x1[i],x2[i])&&between(jx,x1[j],x2[j])&&between(jy,y1[i],y2[i])&&between(jy,y1[j],y2[j]))
          //printf("(%f,%f)\n ",jx,jy);
          num++;
       }
      }
   }
   printf("%d\n",num);
  }
  return 0;
}
2014-05-09 14:44
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:0 
想好的 可以先写一点,大家帮你改改。

我不是砖家,要努力成为砖家。
2014-05-09 15:21
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
好的
2014-05-09 15:24
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
回复 42 楼 宇宙规律
平行啊,,

另外,最好用结构体把数据结构弄清晰

struct Point{int X, Y;};


[fly]存在即是合理[/fly]
2014-05-09 15:49
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
楼主好好写。
2014-05-09 18:40
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
2014-05-09 19:22
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
y=k1x+b1,y=k2x+b2两条直线平行的条件是:k1=k2

a1*x+b1*y+c1=0       a2*x+b2*y+c2=0
y=-(a1/b1)*x-c1      y=-(a2/b2)*x-c2

-(a1/b1)=-(a2/b2)
a1/b1=a2/b2

即a1*b2-b1*a2=0
两条直线不平行的条件是:a1*b2-b1*a2!=0    即:if(a[i]*b[j]-a[j]*b[i]!=0)
2014-05-10 13:00
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
漂亮的推理。
2014-05-10 13:19
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:0 
楼上计算错了!
y=k1x+b1,y=k2x+b2两条直线平行的条件是:k1=k2
a1*x+b1*y+c1=0       a2*x+b2*y+c2=0

y=-(a1/b1)*x-c1/b1
y=-(a2/b2)*x-c2/b2

-(a1/b1)=-(a2/b2)
a1/b1=a2/b2
即a1*b2-b1*a2=0
两条直线不平行的条件是:a1*b2-b1*a2!=0    即:if(a[i]*b[j]-a[j]*b[i]!=0)
2014-05-10 13:20
快速回复:如何用C语言解出多条线段的交点坐标?求大师赐教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038332 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved