直线类怎么设计比较好?

vvsxr 2014-01-29 12:36:38
现在需要一个直线类 CLine
我想到了两种方案:
第一个是这样:

class CLine
{
public:
float x1,y1,x2,y2;
float GetLength();
};


第二个是这样:

class CLine
{
public:
void SetPosition(x1,y1,x2,y2);
void SetHead(x1,y1);
void SetTail(x2,y2);
void GetHeadX();
void GetHeadY();
void GetTailX();
void GetTailY();
void GetLength();
private:
float _x1,_y1,_x2,_y2;
};


这两个哪个好点啊?
第一个每次取长度的时候都得算一遍,第二个不需要每次都算,不过set get好像有点麻烦
...全文
298 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2014-01-30
  • 打赏
  • 举报
回复
严格来讲,直线和线段不是一个概念
encoderlee 版主 2014-01-29
  • 打赏
  • 举报
回复
如果测试几百万次循环的话,两种方法耗时毫秒数都相同,差距不足1毫秒,感觉不出差别来了。 而实际应用中整个程序从运行到退出,总调用次数也不会上百万次吧。所以效率问题暂时不用考虑。先考虑编码时的易用问题。
vvsxr 2014-01-29
  • 打赏
  • 举报
回复
引用 8 楼 CharlesSimonyi 的回复:
并且我的CPU是很低端的1.8GHZ主频的酷睿双核。如果是INTEL I3 I5的话,其效果就。。。
这是我的测试代码
#include <math.h>
#include <Windows.h>
#include <iostream>
#include <stdlib.h>
#define M_PI	3.14159265358979323846f
#define M_PI_2	1.57079632679489661923f
#define M_PI_4	0.785398163397448309616f
#define M_1_PI	0.318309886183790671538f
#define M_2_PI	0.636619772367581343076f

using namespace std;

class Line1
{
public:
	float m_x1,m_y1,m_x2,m_y2,v,rotate;
	Line1(float x1, float y1, float x2, float y2)
	{
		m_x1 = x1;
		m_x2 = x2;
		m_y1 = y1;
		m_y2 = y2;
	}
	float GetLen(int a){m_x1 = a;return sqrt((m_x2 - m_x1)*(m_x2 - m_x1) + (m_y2 - m_y1)*(m_y2 - m_y1));}
	float Getrot(int a)
	{
		m_x1 = a;
		float lx = m_x2 - m_x1,ly = m_y2 - m_y1;
		if(lx!=0)
		{
			rotate = atan(ly/lx);
			//在第一、四象限
			if(lx > 0)
			{
				if(ly < 0)rotate += 2 * M_PI;
			}
			//在第二、三象限
			else rotate += M_PI;
		}
		else
		{
			if(ly>0)rotate = M_PI_2;
			else if(ly<0)rotate = M_PI_4 * 3;
			else rotate = 0;
		}
		return rotate;
	}
};

class Line2
{
private:
	float m_x1,m_y1,m_x2,m_y2,m_len,v,rotate;
public:
	Line2(float x1, float y1, float x2, float y2)
	{
		m_x1 = x1;
		m_x2 = x2;
		m_y1 = y1;
		m_y2 = y2;
		m_len = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
		float lx = m_x2 - m_x1,ly = m_y2 - m_y1;
		if(lx!=0)
		{
			rotate = atan(ly/lx);
			//在第一、四象限
			if(lx > 0)
			{
				if(ly < 0)rotate += 2 * M_PI;
			}
			//在第二、三象限
			else rotate += M_PI;
		}
		else
		{
			if(ly>0)rotate = M_PI_2;
			else if(ly<0)rotate = M_PI_4 * 3;
			else rotate = 0;
		}
	}
	float GetLen(int a){m_x1 = a;return m_len;}
	float Getrot(int a){m_x1 = a;return rotate;}
};

void main()
{
	Line1 L1(5,3,10,20);
	Line2 L2(5,3,10,20);
	float fResult;
	DWORD dwTime1 = GetTickCount();
	for (unsigned long long i=0; i<1000000000; ++i)
	{
		fResult = L1.GetLen(rand());
	}
	DWORD dwTime2 = GetTickCount();
	cout<<dwTime2 - dwTime1<<endl;
	dwTime1 = GetTickCount();
	for (unsigned long long i=0; i<1000000000; ++i)
	{
		fResult = L2.GetLen(rand());
	}
	dwTime2 = GetTickCount();
	cout<<dwTime2 - dwTime1<<endl;
	system("pause");
}
每循环加入了随机数,以防简单循环直接被优化掉。 除了计算长度,还计算了倾角 在计算长度时,第二种方法只比第一种方法快几百毫秒。 在计算倾角时,第二种方法用时是第一种方法的一半。 看来在if语句的时候速度就慢了。如果只需要长度的话,两种方法基本没区别了。 不知道我的计算倾角的算法有没有可以优化的地方
encoderlee 版主 2014-01-29
  • 打赏
  • 举报
回复
并且我的CPU是很低端的1.8GHZ主频的酷睿双核。如果是INTEL I3 I5的话,其效果就。。。
encoderlee 版主 2014-01-29
  • 打赏
  • 举报
回复

#include <math.h>
#include <Windows.h>
#include <iostream>
using namespace std;

class Line1
{
public:
	float m_x1,m_y1,m_x2,m_y2;
	Line1(float x1, float y1, float x2, float y2)
	{
		m_x1 = x1;
		m_x2 = x2;
		m_y1 = y1;
		m_y2 = y2;
	}
	float GetLen(){return sqrt((m_x2 - m_x1)*(m_x2 - m_x1) + (m_y2 - m_y1)*(m_y2 - m_y1));}
};

class Line2
{
private:
	float m_x1,m_y1,m_x2,m_y2,m_len;
public:
	Line2(float x1, float y1, float x2, float y2)
	{
		m_x1 = x1;
		m_x2 = x2;
		m_y1 = y1;
		m_y2 = y2;
		m_len = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
	}
	float GetLen(){return m_len;}
};

void main()
{
	Line1 L1(5,3,10,20);
	Line2 L2(5,3,10,20);
	float fResult;
	DWORD dwTime1 = GetTickCount();
	for (unsigned long long i=0; i<1000000000; ++i)
	{
		fResult = L1.GetLen();
	}
	DWORD dwTime2 = GetTickCount();
	cout<<dwTime2 - dwTime1<<endl;
	dwTime1 = GetTickCount();
	for (unsigned long long i=0; i<1000000000; ++i)
	{
		fResult = L2.GetLen();
	}
	dwTime2 = GetTickCount();
	cout<<dwTime2 - dwTime1<<endl;
}
我刚试了下,Release编译出来运行。 在一个十亿次的循环中分别调用两种类获取长度的方法。 第一种耗时1594毫秒,第二种耗时1516毫秒。 调用十亿次,第二种只比第一种快78毫秒。 如果你的调用量只是几千万次甚至一亿次的话,几乎没有差别。 而事实上在实际应用的程序中,再频繁也就调用几千次最多几万次,结果就。。。。效率相差几微秒,哦不,纳秒
brk1985 2014-01-29
  • 打赏
  • 举报
回复
mark下。。。
encoderlee 版主 2014-01-29
  • 打赏
  • 举报
回复
。。你可以测试一下,效率影响微乎其微,哪怕是在一个十万次的循环中调用十万次。 包括MFC在内的各种类库,在针对这种问题都是采用第一种方法。 第二种方法还需增加一个成员,很多类库对空间占用的增大都很谨慎。
vvsxr 2014-01-29
  • 打赏
  • 举报
回复
引用 3 楼 CharlesSimonyi 的回复:
当然是第一种,MFC里的CRect之类也是第一种
现在的主要问题是,线段的长度和倾角会非常频繁的调用。每次调用都算一遍有点影响效率啊
encoderlee 版主 2014-01-29
  • 打赏
  • 举报
回复
当然是第一种,MFC里的CRect之类也是第一种
vvsxr 2014-01-29
  • 打赏
  • 举报
回复
引用 1 楼 wqvbjhc 的回复:
第二个比第一个多了几个成员函数 GetLength的实现应该都一样,不存在一个算一遍,一个每次都算。
两个不一样啊,第一个可以直接设置x,y但是length不能自动自己算,GetLength里是计算的公式。 第二个设置x,y时可以自动计算length,GetLength是直接返回就好了
wqvbjhc 2014-01-29
  • 打赏
  • 举报
回复
第二个比第一个多了几个成员函数 GetLength的实现应该都一样,不存在一个算一遍,一个每次都算。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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