64,682
社区成员
发帖
与我相关
我的任务
分享
#include<Windows.h>
#include<stdio.h>
#include<time.h>
class Line
{
public:
static bool SegmentSegmentCross(Line &s1,Line &s2) ;
public:
POINT p1 ;
POINT p2 ;
} ;
int main()
{
Line s1,s2 ;
s1.p1.x=30,s1.p1.y=30 ;
s1.p2.x=30,s1.p2.y=100 ;
s2.p1.x=40 ;s2.p1.y=40 ;
s2.p2.x=25,s2.p2.y=400 ;
printf("s1.p1.x=%d,s1.p1.y=%d\ns1.p2.x=%d,s1.p2.y=%d\ns2.p1.x=%d,s2.p1.y=%d\ns2.p2.x=%d,s2.p2.y=%d\n",
s1.p1.x ,s1.p1.y,s1.p2.x ,s1.p2.y,s2.p1.x,s2.p1.y,s2.p2.x,s2.p2.y) ;
printf("%d\n\n",Line::SegmentSegmentCross(s1,s2) );
long time=clock() ;
for(unsigned __int64 i=0;i<999999999;i++)
{
Line::SegmentSegmentCross(s1,s2) ;
}
printf("999999999次花费时间:%lfs\n",(double)(-time+clock())/1000) ;
return 0 ;
}
bool Line::SegmentSegmentCross(Line &s1,Line &s2)
{
int s1_x=s1.p1.x-s1.p2.x ;
int s1_y=s1.p1.y-s1.p2.y ;
int s2_x=s2.p1.x-s2.p2.x ;
int s2_y=s2.p1.y-s2.p2.y ;
//printf("s1_x=%d,s1_y=%d,s2_x=%d,s2_y=%d\n",s1_x,s1_y,s2_x,s2_y) ;
if(s1_x!=0 && s2_x!=0) //k1、k2都存在
{
//printf("k1、k2都存在\n") ;
double k1= (double)s1_y / (double)s1_x ;
double k2= (double)s2_y / (double)s2_x ;
double b1=s1.p1.y-s1_y/s1_x*s1.p1.x ;
double b2=s2.p1.y-s2_y/s2_x*s2.p1.x ;
if(k1>k2-0.000001 && k1<k2+0.000001)
{
//平行
//printf("平行\n") ;
if(s1.p1.y>k2*s1.p1.x+b2-0.000001 && s1.p1.y<k2*s1.p1.x+b2+0.000001 ) // if(s1.p1.y==k2*s1.p1.x+b2)
return 1 ;
else return 0 ;
}
//printf("不平行\n") ;
double x=(b2-b1) / (k1 - k2) ;
double y=k1*x+b1 ;
//printf("k1=%lf,b1=%lf,k2=%lf,b2=%lf\n(x,y)=(%lf,%lf)\n",k1,b1,k2,b2,x,y) ;
double ymax,ymin ;
ymax=max(s1.p1.y,s1.p2.y) ;
ymin=min(s1.p1.y,s1.p2.y) ;
if(y>ymax+0.000001 || y<ymin-0.000001)
return 0 ;
ymax=max(s2.p1.y,s2.p2.y) ;
ymin=min(s2.p1.y,s2.p2.y) ;
if(y>ymax+0.000001 || y<ymin-0.000001)
return 0 ;
return 1 ;
}
else
{
//printf("至少有一条直线k不存在(至少有一条直线垂直)\n") ;
if(s1_x==0)
{
if(s2_x==0) // s1_x==0 and s2_x==0
{
//printf("都垂直\n") ;
if(s1.p1.y==s2.p1.y)
return 1 ;
else return 0 ;
}
else // s1_x==0 and s2_x!=0
{
double xmax,xmin ;
xmax=max(s2.p1.x,s2.p2.x) ;
xmin=min(s2.p1.x,s2.p2.x) ;
if(s1.p1.x<xmax+0.000001 && s1.p1.x>xmin-0.000001)
{ //以下代码考虑的是,x轴上有投影相交,y轴不想交
double k2=(double)s2_y/(double)s2_x ;
double b2=s2.p1.y-k2*s2.p1.x ;
double y=k2*s1.p1.x+b2 ;
double ymin,ymax ;
ymax=max(s1.p1.y,s1.p2.y) ;
ymin=min(s1.p1.y,s1.p2.y) ;
if(y<ymax+0.000001 && y>ymin-0.000001)
return 1 ;
else return 0 ;
}
else return 0 ;
}
}
else //s1_x!=0
{
double xmax,xmin ;
xmax=max(s1.p1.x,s1.p2.x) ;
xmin=min(s1.p1.x,s1.p2.x) ;
if(s2.p1.x<xmax+0.000001 && s2.p1.x>xmin-0.000001)
{
double k1=(double)s1_y/(double)s1_x ;
double b1=s1.p1.y-k1*s1.p1.x ;
double y=k1*s2.p1.x+b1 ;
double ymin,ymax ;
ymax=max(s2.p1.y,s2.p2.y) ;
ymin=min(s2.p1.y,s2.p2.y) ;
if(y<ymax+0.000001 && y>ymin-0.000001)
return 1 ;
else return 0 ;
}
else return 0 ;
}
}
}
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
long long sum = 0;
for(int i = 0; i < 999999999; ++i)
{
for(int j = 0; j < 999999999; ++j)
{
sum += j;
}
sum = 0;
}
return 0;
}
int a1 = 0;
013926FD mov dword ptr [ebp-14h],0
for (int i = 0; i<100000; i++)
01392704 mov dword ptr [i],0
0139270B jmp main+56h (1392716h)
0139270D mov eax,dword ptr [i]
01392710 add eax,1
01392713 mov dword ptr [i],eax
01392716 cmp dword ptr [i],186A0h
0139271D jge main+68h (1392728h)
{
a1 = 1;
0139271F mov dword ptr [ebp-14h],1
}
01392726 jmp main+4Dh (139270Dh)
printf("%d\n", a1);
01392728 mov esi,esp
0139272A mov eax,dword ptr [ebp-14h]
0139272D push eax
0139272E push offset string "%d\n" (13A0A48h)
01392733 call dword ptr [__imp__printf (13A5714h)]
01392739 add esp,8
0139273C cmp esi,esp
0139273E call @ILT+1165(__RTC_CheckEsp) (1391492h)
int a1 = 0;
for (int i = 0; i<100000; i++)
{
a1 = 1;
}
printf("%d\n", a1);
010E10A2 mov ebx,dword ptr [__imp__printf (10E4140h)]
010E10A8 push 1
010E10AA push offset string "%d\n" (10E41ECh)
010E10AF call ebx
010E10B1 add esp,8