41
44
//------------------------------------------------------------------- sCurve ---
43
46
sCurve::sCurve (rsObjectStream a_stream)
44
:s2DVisibleObject(a_stream)
47
:sGraphObject(a_stream)
52
void sCurve::Store (rsObjectStream a_stream)
54
sGraphObject::Store(a_stream);
58
int sCurve::Distance (rcsIntPoint position
63
sCurve::psTracer T = GetCurveTracer(scales);
64
int D_min = std::numeric_limits<int>::max();
66
// P -- точка с координатами position
67
sPoint R; //вектор, идущий из точки кривой в точку P
68
sPoint L; //вектор отрезка кривой
69
real LengthL; //его длина
70
sPoint PP; //вектор, идущий из начала отрезка кривой
72
sPoint PPP; //координаты точки P в системе координат,
73
//повёрнутой так, что ось х совмещена с
76
DD_min= real(std::numeric_limits<int>::max())
77
* real(std::numeric_limits<int>::max());
78
while( T->NextPoint() ){
79
R = position - scales.Tr(T->Point);
85
while( T->NextLineSegment() ){
86
PP = position - scales.Tr(T->LineSegment.Start);
87
L = scales.Tr(T->LineSegment.End) - scales.Tr(T->LineSegment.Start);
88
LengthL = sqrt(L.X*L.X+L.Y*L.Y);
89
PPP.X = (L.X/LengthL)*PP.X + (L.Y/LengthL)*PP.Y;
90
PPP.Y = (L.Y/LengthL)*PP.X - (L.X/LengthL)*PP.Y;
92
DD = PPP.X*PPP.X + PPP.Y*PPP.Y;
93
}else if( PPP.X > LengthL ){
94
DD = (PPP.X-LengthL)*(PPP.X-LengthL) + PPP.Y*PPP.Y;
103
D_min = std::min( D_min , Round(sqrt(DD_min)) );
107
if( T ){ delete T; T=NULL; };
111
//---------------------------------------------------------------- sFunction ---
113
sFunction::sFunction (rsObjectStream a_stream)
119
void sFunction::Store (rsObjectStream a_stream)
121
sCurve::Store(a_stream);
125
//real sFunction::Value (real /*X*/)
133
//-------------------------------------------------------------- sDependence ---
135
sDependence::sDependence ()
139
,RecalculateBoundaries(true)
141
TheMultiplier.X = sPhysValue(real_nan);
142
TheMultiplier.Y = sPhysValue(real_nan);
146
sDependence::sDependence (rcsPhysPair multiplier)
149
,TheMultiplier(multiplier)
150
,RecalculateBoundaries(true)
152
//this would be safe for AssignIntrinsicContent
153
// TheMultiplier.X = multiplier.X;
154
// TheMultiplier.Y = multiplier.Y;
158
sDependence::sDependence (rsObjectStream a_stream)
45
160
,sRecord(a_stream)
161
,TheMultiplier(a_stream)
162
,RecalculateBoundaries(true)
50
void sCurve::Store (rsObjectStream a_stream)
167
void sDependence::Store (rsObjectStream a_stream)
52
s2DVisibleObject::Store(a_stream);
169
sFunction::Store(a_stream);
53
170
sRecord::Store(a_stream);
171
TheMultiplier.Store(a_stream);
57
sString sCurve::Text (eTextFormat F
58
,eTextDetalization D) const
175
sString sDependence::Text (eTextFormat F
176
,eTextDetalization D) const
61
psCurveAppearance A = dynamic_cast<psCurveAppearance>(Appearance);
62
if( A && (F == HTML) ){
64
T += A->/*Line.*/Color.TagForHTML();
67
return T + sRecord::Text(F,D);
180
T = Symbol::CurveIcon;
181
psCurveAppearance A = dynamic_cast<psCurveAppearance>(Appearance);
183
T = sString("<font ") + A->/*Line.*/Color.TagForHTML() + ">"
188
T += sRecord::Text(F,D);
190
T += sString(" [") + TheMultiplier.Y.Units().Text(F)
191
+sString("(") + TheMultiplier.X.Units().Text(F) + sString(")]");
71
void sCurve::AssignIntrinsicContent (sNodePtr NP)
197
void sDependence::AssignIntrinsicContent (sNodePtr NP)
73
199
sRecord::AssignIntrinsicContent(NP);
74
// if( NP->OwnType() <= sCurve::Type ){
79
sBoundaries sCurve::Boundaries ()
81
sCurve::psTracer T = GetCurveTracer();
200
sDependence::sPtr Ptr(NP);
201
if( Ptr.IsCorrect() ){
202
//! @todo{Net} will throw exception, if units differ
203
TheMultiplier = Ptr->TheMultiplier;
204
RecalculateBoundaries=Ptr->RecalculateBoundaries;
205
LastBoundaries=Ptr->LastBoundaries;
211
sBoundaries sDependence::Boundaries ()
213
if( RecalculateBoundaries ){
214
LastBoundaries=CalculateBoundaries();
215
RecalculateBoundaries=false;
218
return LastBoundaries;
222
sBoundaries sDependence::CalculateBoundaries ()
225
sCurve::psTracer T=GetCurveTracer(sScales(sScale(Multiplier().X)
226
,sScale(Multiplier().Y)));
232
B = sRectangle( sRange(real_nan,real_nan) , sRange(real_nan,real_nan) );
88
233
if( T->NextPoint() ){
89
234
Xmin = Xmax = T->Point.X;
90
235
Ymin = Ymax = T->Point.Y;
129
if( T ){ delete T; T=NULL; };
134
bool sCurve::IsUnambigousFunction () const
140
real sCurve::Value (real /*X*/) const
147
int sCurve::Distance (sPoint P
151
sCurve::psTracer T = GetCurveTracer();
156
DD_min= real(std::numeric_limits<int>::max())
157
* real(std::numeric_limits<int>::max());
158
while( T->NextPoint() ){
159
DD=((P.X - T->Point.X)/XPixelValue)*((P.X - T->Point.X)/XPixelValue)
160
+((P.Y - T->Point.Y)/YPixelValue)*((P.Y - T->Point.Y)/YPixelValue);
165
while( T->NextLineSegment() ){
167
PP.X = (PP.X - T->LineSegment.Start.X) / XPixelValue;
168
PP.Y = (PP.Y - T->LineSegment.Start.Y) / YPixelValue;
169
LX = (T->LineSegment.End.X - T->LineSegment.Start.X) / XPixelValue;
170
LY = (T->LineSegment.End.Y - T->LineSegment.Start.Y) / YPixelValue;
171
L = sqrt(LX*LX+LY*LY);
172
PPP.X = (LX/L)*PP.X + (LY/L)*PP.Y;
173
PPP.Y = (LY/L)*PP.X - (LX/L)*PP.Y;
175
DD = PPP.X*PPP.X + PPP.Y*PPP.Y;
176
}else if( PPP.X > L ){
177
DD = (PPP.X-L)*(PPP.X-L) + PPP.Y*PPP.Y;
185
if( T ){ delete T; T=NULL; };
187
return Round(sqrt(DD_min));
189
return std::numeric_limits<int>::max();
275
// RANet::Log.Put(sLog::Debug,"Graph"
276
// ,sString("CalculateBoundaries: ")
277
// +" MX="+Multiplier().X.Text(Plain,Verbose)
278
// +" MY="+Multiplier().Y.Text(Plain,Verbose)
279
// +(sString(" X.From=") << B.X.From)
280
// +(sString(" X.To=") << B.X.To)
281
// +(sString(" Y.From=") << B.Y.From)
282
// +(sString(" Y.To=") << B.Y.To)
285
if( T ){ delete T; T=NULL; };
286
return sBoundaries(sPhysRange(B.X.From*Multiplier().X.ArbValue()
287
,B.X.To*Multiplier().X.ArbValue()
288
,Multiplier().X.Units() )
289
,sPhysRange(B.Y.From*Multiplier().Y.ArbValue()
290
,B.Y.To*Multiplier().Y.ArbValue()
291
,Multiplier().Y.Units() )
193
295
//------------------------------------------------------------------------------