/* * MathPlanner 3.1 - Mathematical design tool. * Copyright(C) 2002 Jarmo Nikkanen * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. * * You should have received a copy of the GNU General Public License with this program. * */ #include #include #include #include #include float radians(float ang) { return(ang*2*3.141592654/360); } QPoint line_cross_point(QPoint a,float aaa,QPoint b,float aab) { QPoint point; float x,y,da,db,aa,ab; aa=radians(aaa); ab=radians(aab); float ax=a.x(); float ay=a.y(); float bx=b.x(); float by=b.y(); if (aa!=ab) { if (cos(aa)==0) y=ay,x=bx+((y-by)*sin(ab)/cos(ab)); else if (cos(ab)==0) y=by,x=ax+((y-ay)*sin(aa)/cos(aa)); else if (sin(aa)==0) x=ax,y=by+((x-bx)*cos(ab)/sin(ab)); else if (sin(ab)==0) x=bx,y=ay+((x-ax)*cos(aa)/sin(aa)); else { da=cos(aa)/sin(aa); db=cos(ab)/sin(ab); x=floor((by-ay+(da*ax)-(db*bx))/(da-db)); y=floor(ay+(da*(x-ax))); } point=QPoint((int)x,(int)y); } else point=QPoint(0,0); return(point); } QPoint cal_point(QPoint origo,float lenght,float angle) { float ox=origo.x(); float oy=origo.y(); float x=ox+lenght*sin(radians(angle)); float y=oy+lenght*cos(radians(angle)); return(QPoint((int)x,(int)y)); } void draw_complex_angle(QRect in,QPainter *paint,int st) { float height=in.height(); float width=in.width(); float x=in.left(); float y=in.top(); float a=30; if (height>25) a=180*atan(14/height)/3.1415; float ang=360-a; float he=height/cos(radians(a)); float wi=height*tan(radians(a)); QPoint point[10]; point[0]=QPoint((int)x,(int)y); point[1]=cal_point(point[0],he,ang); point[2]=point[1]+QPoint((int)(width+wi),0); QPen pen=paint->pen(); pen.setWidth((int)st); paint->setPen(pen); paint->moveTo(point[0]); paint->lineTo(point[1]); paint->lineTo(point[2]); } void complex_angle_size(QRect in,QRect *size) { float height=in.height(); float width=in.width(); float x=in.left(); float y=in.top(); float a=30; if (height>25) a=180*atan(14/height)/3.1415; float ang=360-a; float he=height/cos(radians(a)); float wi=height*tan(radians(a)); QPoint point[10]; point[0]=QPoint((int)x,(int)y); point[1]=cal_point(point[0],he,ang); point[2]=cal_point(point[1],width+wi,90); float w=point[2].x()-point[1].x(); float h=point[1].y()-point[0].y(); QRect rect((int)(x+width-w-1),in.y(),(int)(w+2),(int)h+2); *size=rect; } void square_root_size(QRect in,int *hei,int *hei_b,int *wid,int *hdp,int *dp,int *po) { float height=in.height(); float width=in.width(); float x=in.left(); float y=in.top(); float ang=10; float ang2=20; QPoint point[12]; point[0]=QPoint((int)(x+width),(int)y); point[1]=point[0]-QPoint((int)width,0); point[2]=cal_point(point[1],height/cos(radians(ang)),360-ang); point[3]=cal_point(point[2],height/(cos(radians(ang2))*2),180+ang2); *hei=point[2].y()-point[1].y(); *hei_b=point[2].y()-((int)y); *wid=point[0].x()-point[3].x(); *hdp=point[2].y()-point[3].y(); *dp=point[2].x()-point[3].x(); *po=point[1].x()-point[3].x(); } void draw_square_root(QRect in,QPainter *paint,int st) { float height=in.height(); float width=in.width(); float x=in.left(); float y=in.top(); float ang=10; float ang2=20; QPoint point[12]; point[0]=QPoint((int)(x+width),(int)y); point[1]=point[0]-QPoint((int)width,0); point[2]=cal_point(point[1],height/cos(radians(ang)),360-ang); point[3]=cal_point(point[2],height/(cos(radians(ang2))*2),180+ang2); QPen pen=paint->pen(); pen.setWidth((int)st); paint->setPen(pen); paint->moveTo(point[0]); paint->lineTo(point[1]); paint->lineTo(point[2]); paint->lineTo(point[3]); }