當前位置:首頁 » 編程語言 » 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;
}

熱點內容
怎麼用紙做豌豆解壓玩具 發布:2022-09-29 04:39:17 瀏覽:728
雲存儲播放時間表 發布:2022-09-29 03:58:31 瀏覽:598
新英朗4缸買哪個配置劃算 發布:2022-09-29 03:51:54 瀏覽:121
紅旗5配置怎麼選 發布:2022-09-29 03:44:21 瀏覽:886
linux安裝maven 發布:2022-09-29 03:29:18 瀏覽:595
吉利星瑞豪華天窗版有什麼功能配置 發布:2022-09-29 03:20:28 瀏覽:816
伺服器固定ip和彈性ip一起用 發布:2022-09-29 02:40:49 瀏覽:506
gpioc語言 發布:2022-09-29 02:34:40 瀏覽:951
h乚c語言 發布:2022-09-29 02:34:39 瀏覽:410
迷你世界體驗服正式服密碼是多少 發布:2022-09-29 02:21:19 瀏覽:419