📄 coordinate.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 + -