using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Txgy.EWS.Client.FocalMechanism.Model; using Txgy.Microseismic.BaseLib.Models; using FmGrid = Txgy.EWS.Client.FocalMechanism.Model.FmGrid; using FMStation = Txgy.EWS.Client.FocalMechanism.Model.FMStation; namespace Txgy.EWS.Client.FocalMechanism.Core { /// /// 走滑 /// public class LineFactory : Factory { public int firstAngle { get; set; } public int lastAngle { get; set; } public double?[] distanceArray { get; set; } public int angle { get; set; } public double maxDis { get; set; } public LineFactory(FmGrid g) : base(g) { this.firstAngle = -1; this.lastAngle = -1; this.distanceArray = new double?[180]; angle = -1; } /// /// 判断是否为走滑 /// /// /// public ComputationResult generateResult(FMMap map) { ComputationResult result = null; Line l = computeLine(map); if (l != null) { result = new ComputationResult(); result.graph = l; result.Direction = l.angle < 90 ? l.angle + 90 : l.angle - 90; result.FocalType = FocalMechanismType.strikeSlip; map.T = FocalMechanismType.strikeSlip; } return result; } private Line computeLine(FMMap map) { if (map.posStation.Count == 0 || map.negStation.Count == 0) { return null; } for (int i = 0; i < 180; i++) { double posMax = int.MinValue; double posMin = int.MaxValue; for (int j = 0; j < map.posStation.Count; j++) { int fj = grid.StationList.ToList().FindIndex(fi => fi.Name == map.posStation[j]); if (fj==-1) continue; posMax = Math.Max(posMax, grid.distance[i, fj]); posMin = Math.Min(posMin, grid.distance[i, fj]); } double negMax = int.MinValue; double negMin = int.MaxValue; for (int j = 0; j < map.negStation.Count; j++) { int fj = grid.StationList.ToList().FindIndex(fi => fi.Name == map.negStation[j]); if (fj == -1) continue; negMax = Math.Max(negMax, grid.distance[i, fj]); negMin = Math.Min(negMin, grid.distance[i, fj]); } if (posMax <= negMin) { if (negMin - posMax > maxDis) { maxDis = negMin - posMax; angle = i; } distanceArray[i] = (negMin - posMax) / 2 + posMax; } if (posMin >= negMax) { if (posMin - negMax > maxDis) { maxDis = posMin - negMax; angle = i; } distanceArray[i] = (posMin - negMax) / 2 + negMax; } } //in the case that one of the types only has one point if (map.posStation.Count == 1 || map.negStation.Count == 1) { if (angle == -1 || distanceArray[angle]==null) return null; return new Line(angle, (double)distanceArray[angle]); } return GetMulPoints(); } public Line GetMulPoints() { for (int i = 1; i < 179; i++) { if (distanceArray[i] != null && distanceArray[i - 1] == null) firstAngle = i; if (distanceArray[i] != null && distanceArray[i + 1] == null) lastAngle = i; } if (firstAngle < 0 && lastAngle < 0) return null; if (distanceArray[0] != null && distanceArray[179] == null) firstAngle = 0; if (distanceArray[179] != null && distanceArray[0] == null) lastAngle = 179; if (firstAngle > lastAngle) { lastAngle += 180; } int tempA = (firstAngle + lastAngle) / 2; if (tempA >= 180) tempA -= 180; if (distanceArray[tempA] == null) return null; return new Line(tempA, (double)distanceArray[tempA]); } } }