using System;
// =======================================================================================================================
// Class name: TCircularCalculation
//
// Description:
//
// Copyright (c) 2008-2010 Deltares
//
// Date ID Modification
// 2010-04-20 Best Created
// 2010-04-20 Sel Implementation general StabilityCalculation class
// =======================================================================================================================
namespace Deltares.Stability.Calculation.Inner
{
// TODO -oManders : zones not found
// , zones
public abstract class TCircularCalculation : TStabilityCalculation
{
// Protected fields
protected TCentrePoints FCentrePoints = null;
protected TSlipCircleData FLocalSlipData;
// FZone: TZones;
// protected TRestProfileRec[] FRestProfile;
// =======================================================================================================================
// Date ID Modification
// 2010-04-20 Best Created
// =======================================================================================================================
//Constructor Create()
public TCircularCalculation() : base()
{
// TODO: Add any constructor code here
}
// procedure TestCirkelOnEntryExitPoints(
// LXMid, LZMid, LRad: Double; var ANumberofCirkels: Integer; var AXRightIntersect, AXLeftIntersect: TdoubleArray);
// function TestCenterpointInGeometry(AXMid, AZMid: Double): string;
// function TestEntyExitPointTooHigh(AZMid, AZR, AZL: Double): string;
// function TestIntersectsForbiddenLines(AXMid, AZMid, ARadius, AXL, AXR: Double): string;
// (*
// {=======================================================================================================================
// Date ID Modification
// 2008-04-10 Best Created
// =======================================================================================================================}
// function TCircularCalculation.TestIntersectsForbiddenLines(AXMid, AZMid, ARadius, AXL, AXR: Double): string;
// var
// i: Integer;
// LFound: Boolean;
// begin
// LFound := False;
// for i := low(FInterfaceData.ForbiddenLines) to High(FInterfaceData.ForbiddenLines) do
// begin
// if (FInterfaceData.ForbiddenLines[i].CircleIntersectsForbiddenLine(
// AXMid, AZMid, ARadius, AXl, AXr)) then
// begin
// LFound := True;
// end;
// end;
//
// if LFound then
// Result := 'circle intersects forbidden line'
// else
// Result := '';
//
// end;
// *)
// =======================================================================================================================
//
// Date ID Modification
// 2008-04-09 Best Created
// =======================================================================================================================
protected double DistanceToTangentLine(double AX, double AY)
{
double result;
double A;
double AA;
// richtings coef tussen boven en oderkant raaklijn
double B;
double Ba;
double Xs;
double Ys;
TSlipCircleData _wvar1 = FInterfaceData.SlipCircleData;
if ((Math.Abs(_wvar1.TopTangentX - _wvar1.BottomTangentX) < 1.0E-4))
{
// horizontale raaklijnen
result = Math.Abs(AY - _wvar1.BottomTangentZ);
}
else
{
if ((Math.Abs(_wvar1.BottomTangentZ - _wvar1.TopTangentZ) < 1.0E-4))
{
// vertikale raaklijnen
result = Math.Max(Math.Abs(AX - _wvar1.TopTangentX), Math.Abs(AX - _wvar1.BottomTangentX));
}
else
{
// helling van lijn door middelpunt
A = (_wvar1.BottomTangentZ - _wvar1.TopTangentZ)/(_wvar1.BottomTangentX - _wvar1.TopTangentX);
B = AY - A*AX;
// lijn door middelpunt y = ax + b
// onderste tangent lijn y = aax + BA
AA = -1/A;
Ba = _wvar1.BottomTangentZ - _wvar1.BottomTangentX*AA;
Xs = (Ba - B)/(A - AA);
Ys = Xs*A + B;
result = MStabDatafunctions.Distance2D(AX, AY, Xs, Ys);
}
}
return result;
}
// Protected methods
// =======================================================================================================================
// Descriptiom From the centerpoint pattern circles are created
// A check on the validity of the circles is made
// A valid circle means:
// an entry and exit point must be lower than the middelpoints
// A cirkel may not intersect with forbidden lines
//
// Date ID Modification
// 2008-03-26 Best Created
// =======================================================================================================================
protected void CreateCircles()
{
int i;
int j;
int k;
double dx;
double dz;
double dr;
double LXMid;
double LZMid;
double LRad;
double LMaxRad;
TCentrePoint LCentrePoint;
double LZTangent;
FCentrePoints = new TCentrePoints();
// Validate for each potential circle the exit/entry points
// lies centre point in geometry
// Intersects circle a forbidden line
// bepaal de intervallen tussen de punten
if ((FLocalSlipData.XIntervalCount > 0))
{
dx = (FLocalSlipData.XRightCenterPoint - FLocalSlipData.XLeftCenterPoint)/(FLocalSlipData.XIntervalCount);
}
else
{
dx = 0.0;
}
if ((FLocalSlipData.ZIntervalCount > 0))
{
dz = (FLocalSlipData.ZTopCenterPoint - FLocalSlipData.ZBottomCenterPoint)/(FLocalSlipData.ZIntervalCount);
}
else
{
dz = 0.0;
}
if ((FLocalSlipData.TangentIntervalCount > 0))
{
dr = MStabDatafunctions.Distance2D(FLocalSlipData.TopTangentX, FLocalSlipData.TopTangentZ, FLocalSlipData.BottomTangentX, FLocalSlipData.BottomTangentZ)/FLocalSlipData.TangentIntervalCount;
}
else
{
dr = 0.0;
}
// zet middelpunten en raaklijnen in resultaat
for (j = 0; j <= (FLocalSlipData.XIntervalCount); j ++)
{
LXMid = FLocalSlipData.XLeftCenterPoint + j*dx;
for (i = 0; i <= FLocalSlipData.ZIntervalCount; i ++)
{
LZMid = FLocalSlipData.ZBottomCenterPoint + i*dz;
LCentrePoint = new TCentrePoint();
LCentrePoint.XMid = LXMid;
LCentrePoint.ZMid = LZMid;
LMaxRad = DistanceToTangentLine(LXMid, LZMid);
for (k = 0; k <= (FLocalSlipData.TangentIntervalCount); k ++)
{
LRad = LMaxRad - k*dr;
// straal van raakl
// Test if cirkel is correrct cirkel
LZTangent = LZMid - LRad;
LCentrePoint.Addcircle(LZTangent);
}
// voeg eventueel het vaste punt toe
if ((FLocalSlipData.UseFixedpoint))
{
LRad = MStabDatafunctions.Distance2D(LXMid, LZMid, FLocalSlipData.XFixed, FLocalSlipData.Zfixed);
LZTangent = LZMid - LRad;
LCentrePoint.Addcircle(LZTangent);
}
// Fixed point circle
FCentrePoints.AddCentrePoint(LCentrePoint);
}
// Loop on Z
}
// Loop on x
// With
}
///
/// Create circles with the minimal cicle so far
/// in the middle
///
///
protected void CreateCircles(TMinCircleType AMinimumZone)
//=========================================================
{
double dx = (FLocalSlipData.XRightCenterPoint - FLocalSlipData.XLeftCenterPoint);
double dy = (FLocalSlipData.ZTopCenterPoint - FLocalSlipData.ZBottomCenterPoint);
double dz = (FLocalSlipData.TopTangentZ - FLocalSlipData.BottomTangentZ);
//{nu nieuwe gridpunten neerleggen}
FLocalSlipData.XRightCenterPoint = AMinimumZone.ActiveCentrePointX + 0.5*dx;
FLocalSlipData.XLeftCenterPoint = AMinimumZone.ActiveCentrePointX - 0.5*dx;
FLocalSlipData.ZTopCenterPoint = AMinimumZone.ActiveCentrePointY + 0.5*dy;
FLocalSlipData.ZBottomCenterPoint = AMinimumZone.ActiveCentrePointY - 0.5*dy;
double tangent = AMinimumZone.ActiveCentrePointY - AMinimumZone.ActiveCentrePointRad;
FLocalSlipData.TopTangentZ = tangent + 0.5*dz;
FLocalSlipData.BottomTangentZ = tangent - 0.5*dz;
CreateCircles();
}
}
// end TCircularCalculation
}