⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coordinate.cpp

📁 电子画图板
💻 CPP
字号:
//Coordinate坐标类   
//Coordinate.cpp

//包含的头文件
#include "stdafx.h"
#include "Coordinate.h"
#include "Shape.h"
#include "FirstLine.h"
#include "SecondLine.h"
#include "Circle.h"
#include "fan.h"
#include "tan.h"
#include "Statement.h"
#include "ShapeCategory.h"

//类实现
IMPLEMENT_SERIAL(Coordinate,CObject,1)  

Coordinate::Coordinate(){
	org=CPoint(380,240);
	xScale=20;
	yScale=20;
}

Coordinate::Coordinate(CPoint o,int xS,int yS){
	org=o;
	xScale=xS;
	yScale=yS;
}

Coordinate::Coordinate(int oX,int oY,int xS,int yS){
	org.x=oX;
	org.y=oY;
	xScale=xS;
	yScale=yS;
}

Coordinate::Coordinate(Coordinate &c){	//拷贝构造函数
	org=c.org;
	xScale=c.xScale;
	yScale=c.yScale;
	shapeArray.RemoveAll();
	stateArray.RemoveAll();
}

Coordinate::~Coordinate(){
	delAllShape();
	delAllState();
}

void Coordinate::showAxis(CDC *pDC,int right,int bottom){	//显示坐标系(横轴及纵轴)
	CString s;
	pDC->SelectStockObject(NULL_BRUSH);

	pDC->MoveTo(org.x,org.y);      //画x的正半轴,
	pDC->LineTo(right,org.y);
	pDC->TextOut(right-10,org.y-20,"x");    //标x   
	for(int x1=1;x1<(right/xScale);x1++){     //标格和数字
		pDC->MoveTo(org.x+xScale*x1,org.y+2);
		pDC->LineTo(org.x+xScale*x1,org.y-3);
		if(x1%5==0){
			if(x1<10){
				s.Format(" %d",x1);
			}else{
				s.Format("%d",x1);
			}
			pDC->TextOut(org.x+xScale*x1-7,org.y+2,s);
		}
	}

		pDC->MoveTo(right,org.y);      //标X的箭头
		pDC->LineTo(right-10,org.y-4);
		pDC->MoveTo(right,org.y);
		pDC->LineTo(right-10,org.y+4);
		
		pDC->MoveTo(org.x,org.y);     //画y的正半轴
		pDC->LineTo(org.x,0);
		pDC->TextOut(org.x+10,1,"y");   //标y
		for(int y1=1;y1<(bottom/yScale);y1++){   //标格和数字
			pDC->MoveTo(org.x-2,org.y-yScale*y1);
			pDC->LineTo(org.x+3,org.y-yScale*y1);
			if(y1%5==0){
				if(y1<10){
					s.Format("  %d",y1);
				}else{
					s.Format("%d",y1);
				}
				pDC->TextOut(org.x-18,org.y-yScale*y1-7,s);
			}
		}
		pDC->MoveTo(org.x,0);          //标y的箭头
		pDC->LineTo(org.x-4,10);
		pDC->MoveTo(org.x,0);
		pDC->LineTo(org.x+4,10);

		pDC->MoveTo(org.x,org.y);		//画x的负半轴,
		pDC->LineTo(0,org.y);
		for(int x0=-1;x0>-(right/xScale);x0--){    //标格和数字
			pDC->MoveTo(org.x+xScale*x0,org.y+2);
			pDC->LineTo(org.x+xScale*x0,org.y-3);
			if(x0%5==0){
				if(x0>-10){
					s.Format(" %d",x0);
				}else{
					s.Format("%d",x0);
				}
				pDC->TextOut(org.x+xScale*x0-10,org.y+2,s);
			}
		}

		pDC->MoveTo(org.x,org.y);		//画y的负半轴
		pDC->LineTo(org.x,bottom);
		for(int y0=-1;y0>-(bottom/yScale);y0--){	//标格和数字
			pDC->MoveTo(org.x-2,org.y-yScale*y0);
			pDC->LineTo(org.x+3,org.y-yScale*y0);
			if(y0%5==0){
				if(y0>-10){
					s.Format("  %d",y0);
				}else{
					s.Format("%d",y0);
				}
				pDC->TextOut(org.x-22,org.y-yScale*y0-7,s);
			}
		}
		pDC->MoveTo(org.x,0);
		pDC->LineTo(org.x-4,10);
		pDC->MoveTo(org.x,0);
		pDC->LineTo(org.x+4,10);

	    pDC->TextOut(org.x-10,org.y+1,"0");   //标记原点
}

void Coordinate::showShape(CDC *pDC){	//显示坐标系上(即在图形数组里)的图形
	int i=shapeArray.GetSize();
	Coordinate c=*this;
/*	//debug
	CString s;
	s.Format("%d",i);
	pDC->TextOut(0,0,s);*/
	//遍历图形数组,显示每一个图形
	for(int m=0;m<i;m++){
		Shape *sh=(Shape*)shapeArray.GetAt(m);
		sh->drawShape(pDC,c);
	}
}

void Coordinate::changeAxis(CPoint o,int xS,int yS){	//更改坐标系的原点,单位长度
	org=o;
	xScale=xS;
	yScale=yS;
}

void Coordinate::addShape(double * para,int category){
	Shape *s;
	switch(category){
	case FIRSTLINE:
		s=new FirstLine(para[0],para[1]);	//申请一个一次函数直线类对象							//将其添加入图形数组
		break;
	case SECONDLINE:	
		s=new SecondLine(para[0],para[1],para[2]);	//申请一个二次函数曲线类对象
		break;
	case CIRCLE:
		s=new Circle(para[0],para[1],para[2]);		//申请一个圆类对象
		break;
	case FAN:
		s=new fan(para[0],para[1],para[2],para[3]);	//申请一个反比例曲线类对象
		break;
	case TAN:
		s=new Cos(para[0],para[1],para[2],para[3]);	//申请一个正切曲线类对象
		break;
	default:
		;
	}
	shapeArray.Add(s);				//将图形添加入图形数组
}


void Coordinate::delShape(int index){	//删除坐标系上的图形,该图形在图形数组的下标为index的位置
	Shape *sh;
	sh=(Shape*)shapeArray.GetAt(index);		//获取相应位置的图形指针
	delete sh;		//释放之前申请的空间
	sh=NULL;
	shapeArray.RemoveAt(index);
}

void Coordinate::delAllShape(){		//删除坐标系上的所有图形,即将图形数组清空
	int i=shapeArray.GetSize();
	Shape *sh;
	//遍历图形数组,删除并释放每一个结点
	for(int m=0;m<i;m++){
		sh=(Shape*)shapeArray.GetAt(m);
		delete sh;
		sh=NULL;
	}
	shapeArray.RemoveAll();   //!!!!!!!!!!
}

void Coordinate::Serialize(CArchive& ar){	//串形化
	CObject::Serialize(ar);
	shapeArray.Serialize(ar);		//调用CObject类的串行化函数
	stateArray.Serialize(ar);		//调用CObject类的串行化函数
	if(ar.IsStoring()){
		//storing
		ar <<org <<xScale <<yScale;
	}
	else{
		//loading
		ar >>org >>xScale >>yScale;
	}
}

void Coordinate::resetAxis(){	//复位坐标系,即将坐标系的圆,单位长度恢复为默认值
	org=CPoint(380,240);
	xScale=20;
	yScale=20;
}

void Coordinate::setOrg(CPoint o){	//设置坐标系原点,将其设置为o(视图坐标)
	org=o;
}

void Coordinate::setOrg(int x,int y){	//设置坐标系原点,将其设置为(x,y)(视图坐标)
	org.x=x;
	org.y=y;
}

CPoint Coordinate::getOrg(){	//获取坐标系原点坐标(视图坐标)
	return org;
}

int Coordinate::getOrgX(){		//获取坐标系原点的横轴坐标(视图坐标)
	return org.x;
}

int Coordinate::getOrgY(){		//获取坐标系原点的横轴坐标(视图坐标)
	return org.y;
}

void Coordinate::setXScale(int xS){	//设置坐标系的横轴单位长度(单位为像素)
	xScale=xS;
}

int Coordinate::getXScale(){	//获取坐标系的横轴单位长度(单位为像素)
	return xScale;
}

void Coordinate::setYScale(int yS){	//设置坐标系的纵轴单位长度(单位为像素)
	yScale=yS;
}

int Coordinate::getYScale(){	//获取坐标系的纵轴单位长度(单位为像素)
	return yScale;
}

CPoint Coordinate::getTrueAxis(double x,double y){	//坐标转换,由将点的实际坐标系的坐标转换为视图区的坐标
	CPoint r;
	//根据坐标系的原点,单位长度进行转换
	r.x=(int)(org.x+x*xScale);
	r.y=(int)(org.y-y*yScale);
	return r;
}

void Coordinate::addState(CPoint p,CString s){	//向坐标系上添加注释,即向注释数组中增加一注释
	Statement *st=new Statement(p,s);	//申请一注释对象
	stateArray.Add(st);					//将其添加入注释数组
}
void Coordinate::showState(CDC *pDC){	//显示坐标系上(即在注释数组里)的注释
	int i=stateArray.GetSize();
/*	//debug
	CString str;
	str.Format("%d",i);
	pDC->TextOut(100,100,str);*/
	//遍历注释数组,显示每一个注释
  	for(int m=0;m<i;m++){
		Statement *st=(Statement *)stateArray.GetAt(m);
		st->markState(pDC,st->getStatePoint());
	}
}

void Coordinate::delState(int index){	//删除坐标系上的注释,该注释在注释数组的下标为index的位置
	Statement *st;
	st=(Statement*)stateArray.GetAt(index);		//获取相应位置的注释指针
	delete st;			//释放之前申请的空间
	st=NULL;
	stateArray.RemoveAt(index);
}

void Coordinate::delAllState(){		//删除坐标系上的所有注释,即将注释数组清空
	int i=stateArray.GetSize();
	Statement *st;
	//遍历注释数组,删除并释放每一个结点
	for(int m=0;m<i;m++){
		st=(Statement *)stateArray.GetAt(m);
		delete st;
		st=NULL;
	}
	stateArray.RemoveAll();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -