当前位置:首页 » 编程语言 » c语言相交的线段

c语言相交的线段

发布时间: 2022-08-07 01:48:47

‘壹’ c语言程序课程设计,请高手给个编码

#include <math.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
float x;//x坐标
float y;//y坐标
}TwoD;//用结构体表示二维坐标

double area (float,float,float);//求面积函数
TwoD thirddot(TwoD,TwoD);//求三分点函数
TwoD crossdot(TwoD,TwoD,TwoD,TwoD);//求两线交点函数
float distance(TwoD,TwoD);//求两点距离函数

void main()
{
TwoD DotA,DotB,DotC;//外三角形3个点
float a,b,c,a1,b1,c1;//外,内三角形的3边
TwoD DotA1,DotB1,DotC1;//3个3分点
TwoD DotA2,DotB2,DotC2;//内三角形3个点
double s,s1,n;//外三角形面积,内三角形面积,面积比值

printf("input data please\n");
scanf("%f",&DotA.x);
scanf("%f",&DotA.y);
scanf("%f",&DotB.x);
scanf("%f",&DotB.y);
scanf("%f",&DotC.x);
scanf("%f",&DotC.y);//输入3个顶点坐标

a=distance(DotA,DotB);
b=distance(DotB,DotC);
c=distance(DotB,DotC);//求外三角形3边

if( ((a+b)<=c)||((b+c)<=a)||((a+c)<=b) )
printf("data error!\n");//输入点不能构成三角形输出error

else
{
DotA1=thirddot(DotA,DotB);
DotB1=thirddot(DotB,DotC);
DotC1=thirddot(DotC,DotA);//求三个三分点

DotA2=crossdot(DotA,DotB1,DotC1,DotB);
DotB2=crossdot(DotA1,DotC,DotC1,DotB);
DotC2=crossdot(DotA,DotB1,DotA1,DotC);//求内三角形3个顶点

a1=distance(A2,B2);
b1=distance(B2,C2);
c1=distance(A2,C2);//求内三角形3边长

s=area(a,b,c);//外三角形面积
s1=area(a1,b1,c1);//内三角形面积

n=s/s1;
printf("the scanle of their areas is %12.10f",n);//打印出比值
}
}

//求三分点函数
TwoD thirddot(TwoD DotA,TwoD DotB)
{
TwoD DotC;
DotC.x=(DotA.x+2*DotB.x)/3;
DotC.y=(DotA.y+2*DotB.y)/3;
return (DotC);
}

//求两线交点函数
TwoD crossdot(TwoD DotA,TwoD DotB,TwoD DotC,TwoD DotD)
//即AB和CD交点
{
float a,b,c,d;
TwoD DotE;
a=(DotA.y-DotB.y)/(DotA.x-DotB.x);
b=(DotC.y-DotD.y)/(DotC.x-DotD.x);
DotE.x=(DotC.y-DotA.y+a*DotA.x-b*DotC.x)/(a-b);
DotE.y=a*(DotE.x-DotA.x)+DotA.y;
return (DotE);
}

//三角形面积函数
double area(float a,float b,float c)
{
float p;
double s;
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
return (s);
}

//两点距离函数
float distance(TwoD DotA,TwoD DotB)
{
float d;
d=sqrt((DotA.x-DotB.x)*(DotA.x-DotB.x)+(DotA.y-DotB.y)*(DotA.y-DotB.y));
return (d);
}

编译通过,不过得到的n值一般是7加减十万分之几,并且对于非正三角形也成立。
作为数学的证明题,用c语言只能说证明你输入的具体数字所代表的例子的正确性,要穷举所有可能性是不可能的,c语言还不具有模糊穷举的功能。

‘贰’ 如何用C语言编程解决:空间两线段间的最小距离,已经两线段起点终点坐标。在线求解答

我可以给你思路:
先判断是否相交,相交则距离为0;
若不相交,则最短距离必然某两个端点间的距离,求出线段1起点、终点到线段2起点、终点的距离,挑出4个值中最小的即是。
注:判断是否相交,网上有很多代码,随便google一下
如果你会写c语言代码,我相信你自己能够办到了

‘叁’ C语言求两直线的交点

1、首先在打开的C语言软件中,先用for循环输入两个集合放到a、b两个数组中,如下图所示。

‘肆’ c语言,哪位大神知道这个程序怎么写,一直卡在线段没相交怎么解。

以下我写了一种方法,供题主参考。

#include<stdio.h>
#include<stdlib.h>

//这个struct用于代表一条线段,总共有
//三条线段,所以建一个长度为3的数组
structsegment{
intstart;
intend;
}segments[3];

//函数声明
intcmp_function(constvoid*seg_1,constvoid*seg_2);
intcalculate_length(structsegment*segments);

intmain(){

structsegmentseg_a,seg_b,seg_c;
inta_x1,a_x2,b_x1,b_x2,c_x1,c_x2;

//获取a,b,c的信息,将其存储到struct中
//并放到数组中
printf("输入a的x1坐标: ");
scanf("%d",&a_x1);
seg_a.start=a_x1;
printf("输入a的x2坐标: ");
scanf("%d",&a_x2);
seg_a.end=a_x2;
segments[0]=seg_a;

printf("输入b的x1坐标: ");
scanf("%d",&b_x1);
seg_b.start=b_x1;
printf("输入b的x2坐标: ");
scanf("%d",&b_x2);
seg_b.end=b_x2;
segments[1]=seg_b;

printf("输入c的x1坐标: ");
scanf("%d",&c_x1);
seg_c.start=c_x1;
printf("输入c的x2坐标: ");
scanf("%d",&c_x2);
seg_c.end=c_x2;
segments[2]=seg_c;

//使用C语言stdlib库中的qsort快速排序函数来对
//线段进行排序,比较规则cmp_function需要自己来写
qsort(segments,sizeof(segments)/sizeof(*segments),
sizeof(*segments),cmp_function);

//排序后使用calculate_length函数计算结果并输出
printf("线段覆盖长度为:%d ",calculate_length(segments));

return0;
}


//计算覆盖面长度,基本思路是找出所有的连续线段的长度,
//然后将它们累加
intcalculate_length(structsegment*segments){

inti,j,length=0;

//因为存放三条线段的数组已经排好序,所以按顺序遍历每个线段
for(i=0;i<3;++i){

//将第一条线段的起终点设为连续线段的起终点
intcur_start=segments[i].start;
intcur_end=segments[i].end;

for(j=i+1;j<3;++j){

//访问后一条线段,若其起点在当前连续线段终点之内,说明目前
//线段之间还未出现断点
if(segments[j].start<cur_end){

//此时需要比较一下当前线段和连续线段终点,如果当前线段
//的终点比较长那么就把连续线段的终点换成当前线段的终点,
//这样连续线段的长度就变长了。
cur_end=cur_end<segments[j].end?
segments[j].end:cur_end;

//因为j位置的线段已经处理过了,所以下次循环时直接
//跳过
i=j;

//一旦后一条线段起点在当前连续线段终点之外,那么说明出现了
//断点,也就是说找到了一条以cur_start为起点,cur_end
//为终点的完整的连续线段,那么就可以退出这一轮循环并计算
//连续线段的长度了
}elsebreak;
}

//将总长度加入新增的连续线段的长度,然后开始下一轮循环,寻找
//下一段连续线段
length+=(cur_end-cur_start);
}

returnlength;
}


//比较规则
intcmp_function(constvoid*seg_1,constvoid*seg_2){

//如果线段一的起点小于线段二的起点,那么线段一排在前面
if(((structsegment*)seg_1)->start<
((structsegment*)seg_2)->start)
return-1;

//如果线段一与线段二起点相同,则若线段一终点小于线段二终点,
//将线段一排在前面
elseif(((structsegment*)seg_1)->start==
((structsegment*)seg_2)->start&&
((structsegment*)seg_1)->end<=
((structsegment*)seg_2)->end)
return-1;

//非上述情况则将线段二排在前面
return1;
}


几种情况下的运行结果:


题主题目中的数据:


‘伍’ C语言,线段相交,如图,急用,求大神指教

boolisIntersected(pointo1,pointp1,pointo2,pointp2)
{
doublemult(pointa,pointb,pointc)
{
return(a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
if(max(o1.x,p1.x)<min(o2.x,p2.x))
{
returnfalse;
}
if(max(o1.y,p1.y)<min(o2.y,p2.y))
{
returnfalse;
}
if(max(o2.x,p2.x)<min(o1.x,p1.x))
{
returnfalse;
}
if(max(o2.y,p2.y)<min(o1.y,p1.y))
{
returnfalse;
}
if(mult(o2,p1,o1)*mult(p1,p2,o1)<0)
{
returnfalse;
}
if(mult(o1,p2,o2)*mult(p2,p1,o2)<0)
{
returnfalse;
}
returntrue;
}

‘陆’ 用c语言 求点到线段垂线的交点,怎么求

设线段两点是 (x1,y1)(x2,y2),另外一个点是(x3,y3),那么他的方向向量就是 (a,b)=(x2-x1,y2-y1),那么他的垂线段的方向向量就是 (-b,a); 那么垂线的方程l就是就是 (x-x3)/(-b)=(y-y3)/a,l上的点就是x=t*(-b)+x3,y=a*t+y3,把(x,y)代入线段方程就可以求出t;
#include<stdio.h>

struct point
{
double x,y;
point(double _x,double _y):
x(_x),y(_y){}
};
struct Line
{
double x,y;
point a;
Line(double _x,double _y,point _a):
x(_x),y(_y),a(_a){}

};

int main()
{
double x,y;
printf("输入线段两点\n");
scanf("%lf%lf",&x,&y);point a=point(x,y);
scanf("%lf%lf",&x,&y);point b=point(x,y);
printf("输入线段外一点\n");
scanf("%lf%lf",&x,&y);point c=point(x,y);

Line l=Line(a.x-b.x,a.y-b.y,a);
Line l1=Line(b.y-a.y,a.x-b.x,c);

//ansx=(b.y-a.y)*t+c.x;ansy=(a.x-b.x)*t+c.y

//(ansx-a.x)/(a.x-b.x)=(ansy-a.y)/(a.y-b.y)

double t=((c.y-a.y)*(a.x-b.x)-(c.x-a.x)*(a.y-b.y))/((a.y-b.y)*(b.y-a.y)-(a.x-b.x)*(a.x-b.x));
if(t>1||t<0) puts("不存在");
else
{
double ansx=(b.y-a.y)*t+c.x;
double ansy=(a.x-b.x)*t+c.y;

printf("%lf %lf\n",ansx,ansy);
}
}

‘柒’ 用C语言写个程序判断两条线段的位置关系

很抱歉,第一次写的程序代码有问题方法存在很多未考虑的情况,这是修改后补充的答案。#include<stdio.h>struct point
{
double x;
double y;
};
int main(){struct point a,b,c,d;
double k1,k2,tempx;
printf("input point a,b,c,d(坐标点x值延x轴正方向): \n");
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);
k1=(b.y-a.y)/(b.x-a.x);
k2=(d.y-c.y)/(d.x-c.x);
if(k1==k2)
printf("the two line is horizentol.\n");
else
{tempx=(c.y-a.y+k1*a.x-k2*c.x)/(k1-k2);
if(tempx>=a.x&&tempx<=b.x){printf("两条线段相交。\n");}
else
printf("两条线段不相交。\n");
}
return 0;
}
我已经测试过,可以运行。谢谢采纳。不懂追问。

‘捌’ C语言编写函数实现求两个线段的交点(定义一个函数而不是直接写求解的程序)

欲求二函数交点,必须有二函数的代数表达式,或者必须有两条线段的端点坐标,否则,不可能得到线段的交点。

‘玖’ 用C语言制作一个求两条线段交点的程序

//先判断两条线段是否不平行(最好同时判断是否有交点并且不平行,因为浮//点运算不精确),然后计算两条线段的交点。以下是C语言代码:
#include<stdio.h>
#include<math.h>
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
struct point{double x,y;};

//计算交叉乘积(P1-P0)x(P2-P0)
double xmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

//判点是否在线段上,包括端点
int dot_online_in(point p,point l1,point l2){
return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
}

//判两点在线段同侧,点在线段上返回0
int same_side(point p1,point p2,point l1,point l2){
return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps;
}

//判两直线平行
int parallel(point u1,point u2,point v1,point v2){
return zero((u1.x-u2.x)*(v1.y-v2.y)-(v1.x-v2.x)*(u1.y-u2.y));
}

//判三点共线
int dots_inline(point p1,point p2,point p3){
return zero(xmult(p1,p2,p3));
}

//判两线段相交,包括端点和部分重合
int intersect_in(point u1,point u2,point v1,point v2){
if (!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2))
return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2);
return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2);
}

//计算两线段交点,请判线段是否相交(同时还是要判断是否平行!)
point intersection(point u1,point u2,point v1,point v2){
point ret=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x+=(u2.x-u1.x)*t;
ret.y+=(u2.y-u1.y)*t;
return ret;
}

int main(void)
{
point u1,u2,v1,v2,ans;
printf("请输入线段1的两个端点:\n");
scanf("%lf%lf%lf%lf",&u1.x,&u1.y,&u2.x,&u2.y);
printf("请输入线段2的两个端点:\n");
scanf("%lf%lf%lf%lf",&v1.x,&v1.y,&v2.x,&v2.y);
if (parallel(u1,u2,v1,v2)||!intersect_in(u1,u2,v1,v2)){
printf("无交点!\n");
}
else{
ans=intersection(u1,u2,v1,v2);
printf("交点为:(%lf,%lf)",ans.x,ans.y);
}
return 0;
}

热点内容
引流群控脚本 发布:2024-05-05 08:42:14 浏览:176
sql测试题和答案 发布:2024-05-05 08:42:09 浏览:892
https加密链接 发布:2024-05-05 08:28:35 浏览:444
对等局域网与客户机服务器有什么不同 发布:2024-05-05 07:51:15 浏览:175
win7Linux修复linux 发布:2024-05-05 07:47:17 浏览:61
oracle批处理脚本 发布:2024-05-05 07:32:20 浏览:393
linuxftp响应慢 发布:2024-05-05 07:23:03 浏览:803
sql查询所有字段 发布:2024-05-05 07:22:07 浏览:672
电脑的存储符号 发布:2024-05-05 07:15:21 浏览:132
sql转换成数据类型int时失败 发布:2024-05-05 06:29:21 浏览:827