昵称:烦夫子
类别:界面/平面设计师
年龄:38
现所在地:北京
主页浏览总数:24255
总积分:89
文章数:88
作品数:70
// VectorRun.h: interface for the VectorRun class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_VECTORRUN_H__E16E8F1D_2BAB_4C43_B16F_CEE4A0B65B66__INCLUDED_)
#define AFX_VECTORRUN_H__E16E8F1D_2BAB_4C43_B16F_CEE4A0B65B66__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/******************矢 量 计 算 类 *****************/
#include
#include "vector.h"
#define MINI 1e-10
#undef PI
#define PI 3.14159265358979323846
#define PI2 (2 * PI)
#define DEGREES_TO_RADIANS (PI / 180)
#define UNSET_VALUE -1.23432101234321e+308
typedef long HRESULT;
#define DEF_EXPORT _declspec(dllexport)
//变换函数
typedef Vector (* TransformFunc) (const Vector&);
class DEF_EXPORT VectorRun
{
public:
Vector DotOrg; //文档的原点
long XOrgOffset;
long YOrgOffset; //绘图的原点的平移量
float fPrintSx; //for printer
float fPrintSy; //for printer
Vector OffsetP; //变换参数
Vector CenterP;
Vector RotateP;
public:
VectorRun();
virtual ~VectorRun();
public:
float Length (const Vector& v);
//计算行列式
// | v1.x v2.x |
// | v1.y v2.y |
float Det (const Vector& v1, const Vector& v2);
//计算角度和
//a = (cos(a1), sin(a1)), b = (cos(a2), sin(a2))
//return (cos(a1+b1), sin(a1+b1))
Vector AngleAdd (const Vector& a, const Vector& b);
//计算角度差
//a = (cos(a1), sin(a1)), b = (cos(a2), sin(a2))
//return (cos(a1-b1), sin(a1-b1))
Vector AngleSub (const Vector& a, const Vector& b);
//旋转v, angle.x = cos, angle.y = sin
Vector Rotate (const Vector& v, const Vector& angle);
//X轴镜像点
Vector MirrorVectorX(const Vector& v1);
//Y轴镜像点
Vector MirrorVectorY(const Vector& v1);
//移动矢量,水平移动
Vector MoveVectorX(const Vector& v1, float len);
//移动矢量,垂直移动
Vector MoveVectorY(const Vector& v1, float len);
//矢量按轴中心对称
Vector ReverseVector (const Vector& v1);
//功能:判断向量c的幅角是不是在end和start所确定的幅角范围内
bool InAngleRange(const Vector& start,const Vector& end,const Vector& c);
//矢量角度,返回余旋
double Vectorangle(const Vector& v1);
//计算单位矢量
Vector UnitVector (const Vector& v);
//计算点P1到点P2的距离
float Distance (const Vector& p1, const Vector& p2);
// 计算两点的中点
Vector MidTwoVector(const Vector& p1, const Vector& p2);
//计算出比例分割两点之间的 比分点
// |______ l1 _________|______________ l2 ____________|
// |...................|..............................|
// p1 v(返回的点) p2
Vector ProrateTwoVector(const Vector& p1, const Vector& p2,float l1,float l2);
//计算出比例分割两点之间的 比分点
// |______ u _________ |______________ 1-u ____________|
// |...................|..............................|
// p1 v(返回的点) p2
Vector ProrateTwoVector(const Vector& p1, const Vector& p2,float u);
//求最小点
Vector VMin (const Vector& p1, const Vector& p2);
//求最大点
Vector VMax (const Vector& p1, const Vector& p2);
//函数功能:求取两个向量的夹角(0-180或0-PI)
//入口参数:a,b 分别为向量a和向量b IsRadian:输出是否为弧度
//输出参数:两向量的夹角
double AngleTwoVectors(const Vector& a,const Vector& b,BOOL IsRadian=TRUE);
Vector WorldToDc( const Vector& v);
Vector NullTrans (const Vector& v);
Vector PrintTrans (const Vector& v);
//数据变换
void TransformData (TransformFunc f);
Vector Transform1 (const Vector& v);
Vector Transform1D (const Vector& v);
// For rotate
Vector Transform2 (const Vector& v);
// For rotate Display
Vector Transform2D (const Vector& v);
// For mirror
Vector Transform3 (const Vector& v);
// For mirror display
Vector Transform3D (const Vector& v);
// For enlarge
Vector Transform4 (const Vector& v);
// For enlarge display
Vector Transform4D (const Vector& v);
// For scale
Vector Transform5 (const Vector& v);
// For scale
Vector Transform5D (const Vector& v);
// For scale different in x and y along baseline
Vector Transform6 (const Vector& v);
// For scale different in x and y along baseline
Vector Transform6D (const Vector& v);
// 对称点
Vector Transform7 (const Vector& v);
// 对称点
Vector Transform7D (const Vector& v);
// 重新设置点
void ResetParam ();
// 简化角度
void SimplifyAngle (float& angle);
// 对象复制
//Object* Duplicate (Object* aObject);
int Intersection (Vector& inter, const Vector& p1, const Vector& p2, const Vector& l1, const Vector& l2);
//计算两条线段(p1-p2, l1-l2)的交点
//返回: 0 -- 延长相交, 1 -- 相交, -1 -- 平行
float PointToLine2(const Vector& pa, const Vector& pb, const Vector& pp);
//计算点P到线段(L1,L2)的距离
//总是返回正数
float PointToLine(const Vector& p, const Vector& l1, const Vector& l2,Vector& vDest);
//计算点P到线段(L1,L2)的距离
//以笛卡儿坐标横轴为标准
//返回负数表示垂足不在线段上
float PointToLine (const Vector& p, const Vector& l1, const Vector& l2);
//计算点P到线段(L1,L2)的距离
//返回负数表示垂足不在线段上
float Delta (Vector& p0, Vector& n0, Vector& p1, Vector& n1);
//功能: 计算对于曲线段i从p0点到p1点用直线段逼近的误差值, //采用近似圆弧拟合
//参数: p0, p1 -- 曲线上两点, n0, n1 -- 曲线上两点的法矢
//返回: 误差值
float Det (float det[3][3]);
//功能: 计算三阶行列式的值
//参数: det -- 行列式的元素
//返回: 行列式的值
//tap 得到线段的法向量
Vector GetVerVector(Vector v1,Vector v2,double r);
double CalAngel(Vector &v);
//tap 比较角度的大小
int CompareAngle(Vector sv,Vector ev);
//tap 在线段v1v2求一点,使它与p的连线垂直与v1v2
Vector GetVerPoint(Vector v1, Vector v2,Vector p);
Vector InterPoint (const Vector& p1, const Vector& p2, const Vector& l1, const Vector& l2);
//计算两条线段(p1-p2, l1-l2)的交点
//返回: interpoint 交点
//tap 得到两条交线角平分线线上的一点
Vector GetCirclePoint(Vector v1,Vector v2,Vector v3,Vector v4,float r);
//tap 得到圆弧的型值点,返回型值点个数
int GetArcOrgPoint(Vector ctv,Vector stv,Vector edv,Vector org[] );
//功能: 判断点p是否在v2-v1-v3的区域内
BOOL PointInAngle(Vector v1, Vector v2,Vector v3,Vector p);
//功能,得到形值点
int GetCircleOrgPoint(Vector ctv,float r,Vector org[] );
};
#endif // !defined(AFX_VECTORRUN_H__E16E8F1D_2BAB_4C43_B16F_CEE4A0B65B66__INCLUDED_)