/// <summary> /// 計算線與線的角度 /// </summary> /// <param name="line1">IMeasureGeoModel 線段1</param> /// <param name="line2">IMeasureGeoModel 線段2</param> /// <returns></returns> public static AngleResult AngleLineToLine(IMeasureGeoModel line1, IMeasureGeoModel line2) { AngleResult result = null; //check if (isMeasureModelValid(line1) && isMeasureModelValid(line2)) { //act HTuple angle, firstPhi, secondPhi, interRow, interCol, isParallel; HOperatorSet.AngleLx(line1.Row1, line1.Col1, line1.Row2, line1.Col2, out firstPhi); HOperatorSet.AngleLx(line2.Row1, line2.Col1, line2.Row2, line2.Col2, out secondPhi); HOperatorSet.IntersectionLl(line1.Row1, line1.Col1, line1.Row2, line1.Col2, line2.Row1, line2.Col1, line2.Row2, line2.Col2, out interRow, out interCol, out isParallel); HOperatorSet.AngleLl(line1.Row1, line1.Col1, line1.Row2, line1.Col2, line2.Row1, line2.Col1, line2.Row2, line2.Col2, out angle); result = new AngleResult() { Angle = angle, StartPhi = firstPhi, EndPhi = secondPhi, Row = interRow, Col = interCol, }; } return(result); }
/// <summary> /// 檢查 Measure model 是否合法 /// </summary> /// <param name="model">IMeasureGeoModel</param> /// <returns></returns> private static bool isMeasureModelValid(IMeasureGeoModel model) { bool modelValid = false; bool pointParamCheckValid = ( model != null && model.Row1 != null && model.Col1 != null && model.Row1.TupleLength() > 0 && model.Col1.TupleLength() > 0 && model.Row1 > -1 && model.Col1 > -1); var isLineModel = _lineTypes.Contains(model.GeoType); if (isLineModel) { modelValid = pointParamCheckValid && ( model.Row2 != null && model.Col2 != null && model.Row2.TupleLength() > 0 && model.Col2.TupleLength() > 0 && model.Row2 > -1 && model.Col2 > -1); } else { modelValid = pointParamCheckValid; } return(modelValid); }
/// <summary> /// 計算線到線的距離,發生錯誤回傳 -1 /// </summary> /// <param name="firstModel"></param> /// <param name="secondModel"></param> /// <returns></returns> public static double LineToLine(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { var model = GetTwoLineShortestPointModel(firstModel, secondModel); double distance = (model != null) ? model.Distance.D : -1; return(distance); }
public static MeasureViewModel Get3PointToCircleModel(IMeasureGeoModel pAModel , IMeasureGeoModel pBModel , IMeasureGeoModel pCModel) { MeasureViewModel model = null; var modelValid = isMeasureModelValid(pAModel) && isMeasureModelValid(pBModel) && isMeasureModelValid(pCModel); if (modelValid) { double circleX, circleY; caculateCenterOfCircle(pAModel, pBModel, pCModel, out circleX, out circleY); if (circleX > -1 && circleY > -1) { //radius HTuple radius; HOperatorSet.DistancePp(pAModel.Row1, pAModel.Col1, circleY, circleX, out radius); model = new MeasureViewModel() { Row1 = circleY, Col1 = circleX, Distance = radius, }; } } return(model); }
/// <summary> /// 取得點到線的量測模型 /// </summary> /// <param name="firstModel"></param> /// <param name="secondModel"></param> /// <returns></returns> public static MeasureViewModel GetPointToLineMeasureModel(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { MeasureViewModel model = null; if (isMeasureModelValid(firstModel) && isMeasureModelValid(secondModel)) { var isLineModel = (_lineTypes.Contains(firstModel.GeoType)); var pointModel = (isLineModel) ? secondModel : firstModel; var lineModel = (isLineModel) ? firstModel : secondModel; //取得投影點 double projectionRow, projectionCol; getProjectionPoint(pointModel, lineModel, out projectionRow, out projectionCol); //計算距離 if (projectionRow > 0 && projectionCol > 0) { HTuple distanceMin; HOperatorSet.DistancePp(pointModel.Row1, pointModel.Col1, projectionRow, projectionCol, out distanceMin); model = new MeasureViewModel() { Distance = distanceMin, Row1 = pointModel.Row1, Col1 = pointModel.Col1, Row2 = projectionRow, Col2 = projectionCol, }; } } return(model); }
/// <summary> /// 計算線與線的角度 /// </summary> /// <param name="line1">IMeasureGeoModel 線段1</param> /// <param name="line2">IMeasureGeoModel 線段2</param> /// <returns></returns> public static AngleResult AngleLineToLine(IMeasureGeoModel line1, IMeasureGeoModel line2) { AngleResult result = null; //check if (isMeasureModelValid(line1) && isMeasureModelValid(line2)) { //act HTuple angle, firstPhi, secondPhi, interRow, interCol, isParallel; HOperatorSet.AngleLx(line1.Row1, line1.Col1, line1.Row2, line1.Col2, out firstPhi); HOperatorSet.AngleLx(line2.Row1, line2.Col1, line2.Row2, line2.Col2, out secondPhi); HOperatorSet.IntersectionLl(line1.Row1, line1.Col1, line1.Row2, line1.Col2, line2.Row1, line2.Col1, line2.Row2, line2.Col2, out interRow, out interCol, out isParallel); HOperatorSet.AngleLl(line1.Row1, line1.Col1, line1.Row2, line1.Col2, line2.Row1, line2.Col1, line2.Row2, line2.Col2, out angle); result = new AngleResult() { Angle = angle, StartPhi = firstPhi, EndPhi = secondPhi, Row = interRow, Col = interCol, }; } return result; }
private void initialize(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo, MeasureAssistant mAssist) { _geoModelOne = geoModelOne; _geoModelTwo = geoModelTwo; ROIMeasureType = MeasureType.DistanceY; _ResultWorld = new LineResult(); UpdateResults(); }
private static IMeasureGeoModel getMidPoint(IMeasureGeoModel line) { var midR = (line.Row1 + line.Row2) / 2.0; var midC = (line.Col1 + line.Col2) / 2.0; return(new MeasureViewModel() { Row1 = new HTuple(midR), Col1 = new HTuple(midC), }); }
/// <summary> /// 計算兩元素距離 /// </summary> /// <param name="firstModel"></param> /// <param name="secondModel"></param> /// <returns></returns> public static MeasureViewModel CaculateDistance(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { int sum = 0; if (_pointTypes.Contains(firstModel.GeoType)) { sum += 1; } if (_pointTypes.Contains(secondModel.GeoType)) { sum += 1; } if (_lineTypes.Contains(firstModel.GeoType)) { sum += 2; } if (_lineTypes.Contains(secondModel.GeoType)) { sum += 2; } MeasureViewModel newModel = null; double distance = -1; switch (sum) { case 2: // Point to Point distance = PointToPoint(firstModel, secondModel); if (distance > -1) { newModel = new MeasureViewModel() { Distance = distance, Row1 = firstModel.Row1, Col1 = firstModel.Col1, Row2 = secondModel.Row1, Col2 = secondModel.Col1, }; } break; case 3: // Point to Line or line to point newModel = GetPointToLineMeasureModel(firstModel, secondModel); break; case 4: // line to line newModel = GetTwoLineShortestPointModel(firstModel, secondModel) as MeasureViewModel; break; } return(newModel); }
/// <summary> /// 計算點到線的距離, 發生錯誤,則回傳 -1 /// </summary> /// <param name="firstModel">第一個 Model</param> /// <param name="secondModel">第二個 Model</param> /// <returns></returns> public static double PointToLine(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { double distance = -1; var model = GetPointToLineMeasureModel(firstModel, secondModel); if (model != null) { distance = model.Distance; } return(distance); }
/// <summary> /// 計算點到點的距離, 發生錯誤,則回傳 -1 /// </summary> /// <param name="pointA">點模型</param> /// <param name="pointB">點模型</param> /// <returns></returns> public static double PointToPoint(IMeasureGeoModel pointA, IMeasureGeoModel pointB) { double distance = -1; if (isMeasureModelValid(pointA) && isMeasureModelValid(pointB)) { HTuple distanceMin; HOperatorSet.DistancePp(pointA.Row1, pointA.Col1, pointB.Row1, pointB.Col1, out distanceMin); distance = distanceMin; } return(distance); }
/// <summary> /// 計算點到線的投影點 /// </summary> /// <param name="pointModel">點模型</param> /// <param name="lineModel">線模型</param> /// <param name="projectionRow">點到線的投影位置 (row)</param> /// <param name="projectionCol">點到線的投影位置 (col)</param> private static void getProjectionPoint(IMeasureGeoModel pointModel, IMeasureGeoModel lineModel , out double projectionRow, out double projectionCol) { projectionRow = projectionCol = -1; if (isMeasureModelValid(pointModel) && isMeasureModelValid(lineModel)) { HTuple projRow, projCol; //計算點到線的投影點 HOperatorSet.ProjectionPl(pointModel.Row1, pointModel.Col1 , lineModel.Row1, lineModel.Col1, lineModel.Row2, lineModel.Col2 , out projRow, out projCol); projectionRow = projRow; projectionCol = projCol; } }
/// <summary> /// 3點求圓 /// </summary> /// <param name="pA"></param> /// <param name="pB"></param> /// <param name="pC"></param> /// <param name="circleCenterX">圓心 x 座標</param> /// <param name="circleCenterY">圓心 y 座標</param> private static void caculateCenterOfCircle(IMeasureGeoModel pA , IMeasureGeoModel pB , IMeasureGeoModel pC , out double circleCenterX , out double circleCenterY) { var a1 = pA.Col1; var b1 = pA.Row1; var a2 = pB.Col1; var b2 = pB.Row1; var a3 = pC.Col1; var b3 = pC.Row1; var a1s = Math.Pow(a1, 2); var a2s = Math.Pow(a2, 2); var a3s = Math.Pow(a3, 2); var b1s = Math.Pow(b1, 2); var b2s = Math.Pow(b2, 2); var b3s = Math.Pow(b3, 2); circleCenterX = (a1s * b2 - a1s * b3 + b1 * b3s - b1 * a2s + b3 * a2s - b3s * b2 + b3 * b2s - b1 * b2s + b1 * a3s - b1s * b3 - a3s * b2 + b1s * b2) / (2 * (a1 * b2 + a3 * b1 - a3 * b2 - a1 * b3 - a2 * b1 + a2 * b3)); circleCenterY = -0.5 * (-1 * a1 * a2s + a2 * b1s - a1 * b2s - a3 * a1s - a2 * b3s - a3 * b1s + a3 * a2s + a1 * b3s + a3 * b2s + a1 * a3s - a2 * a3s + a2 * a1s) / (a1 * b2 + a3 * b1 - a3 * b2 - a1 * b3 - a2 * b1 + a2 * b3); }
/// <summary> /// 取得點到線的投影點模型 /// </summary> /// <param name="point"></param> /// <param name="line"></param> /// <returns>point to Projection point Model ( 2 point, projectionPoint at (col2, row2))</returns> private static IMeasureGeoModel getProjectionPlModel(IMeasureGeoModel point, IMeasureGeoModel line) { HTuple rowProj, colProj, distance; HOperatorSet.ProjectionPl(point.Row1, point.Col1, line.Row1, line.Col1, line.Row2, line.Col2 , out rowProj, out colProj); HOperatorSet.DistancePp(point.Row1, point.Col1, rowProj, colProj , out distance); MeasureViewModel model = new MeasureViewModel() { Row1 = new HTuple(point.Row1), Col1 = new HTuple(point.Col1), Row2 = new HTuple(rowProj), Col2 = new HTuple(colProj), Distance = new HTuple(distance), }; return(model); }
/// <summary> /// 計算兩點 Y 方向距離 /// </summary> /// <param name="pointOne">點 1</param> /// <param name="pointTwo">點 2</param> /// <returns></returns> public static LineResult DistanceY(IMeasureGeoModel pointOne, IMeasureGeoModel pointTwo) { LineResult result = null; var modelValid = isMeasureModelValid(pointOne) && isMeasureModelValid(pointTwo); if (modelValid) { var distanceY = Math.Abs(pointOne.Row1.D - pointTwo.Row1.D); result = new LineResult() { Col1 = pointOne.Col1, Col2 = pointOne.Col1, Row1 = pointOne.Row1, Row2 = pointTwo.Row1, Distance = distanceY, }; } return(result); }
/// <summary> /// 計算兩線段的對稱線 /// </summary> /// <param name="modelOne"></param> /// <param name="modelTwo"></param> /// <returns></returns> public static LineResult CalculateSymmetryLine(IMeasureGeoModel modelOne, IMeasureGeoModel modelTwo) { LineResult result = null; var modelValid = isMeasureModelValid(modelOne) && isMeasureModelValid(modelTwo); if (modelValid) { //取得第一條線段的中點 var pointModel = getMidPoint(modelOne); var lineModel = modelTwo; //計算第一線段中點到第二線段上的投影點(垂直距離) HTuple rowProj, colProj; HOperatorSet.ProjectionPl(pointModel.Row1, pointModel.Col1, lineModel.Row1, lineModel.Col1, lineModel.Row2, lineModel.Col2, out rowProj, out colProj); //計算第一線段中點與第二線段上的投影點距離 (point to point) HTuple distance; HOperatorSet.DistancePp(rowProj, colProj, pointModel.Row1, pointModel.Col1, out distance); //取兩線中點 var cRow = (pointModel.Row1 + rowProj) / 2.0; var cCol = (pointModel.Col1 + colProj) / 2.0; //取角度 HTuple angle; HOperatorSet.AngleLx(lineModel.Row1, lineModel.Col1, lineModel.Row2, lineModel.Col2, out angle); //線段 double[] rows, cols; DetermineLine(cRow, cCol, angle, distance, out rows, out cols); result = new LineResult() { Row1 = rows[0], Row2 = rows[1], Col1 = cols[0], Col2 = cols[1], Distance = distance, }; } return(result); }
/// <summary> /// 計算兩線段的交點 /// </summary> /// <param name="geoModelOne"></param> /// <param name="geoModelTwo"></param> /// <returns></returns> public static PointResult IntersetionLine(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo) { PointResult result = null; var modelValid = isMeasureModelValid(geoModelOne) && isMeasureModelValid(geoModelTwo) && isLineType(geoModelOne) && isLineType(geoModelTwo); if (modelValid) { HTuple row, col, isParallel; HOperatorSet.IntersectionLl(geoModelOne.Row1, geoModelOne.Col1, geoModelOne.Row2, geoModelOne.Col2, geoModelTwo.Row1, geoModelTwo.Col1, geoModelTwo.Row2, geoModelTwo.Col2, out row, out col, out isParallel); result = new PointResult() { Row1 = row, Col1 = col, IsParallel = isParallel, }; } return(result); }
/// <summary> /// 取得兩線段之間最短的兩點模型 /// </summary> /// <param name="line1"></param> /// <param name="line2"></param> /// <returns>line model</returns> public static IMeasureGeoModel GetTwoLineShortestPointModel(IMeasureGeoModel line1, IMeasureGeoModel line2) { MeasureViewModel shortestModel = null; var modelValid = (isMeasureModelValid(line1) && isMeasureModelValid(line2)); if (modelValid) { var modelList = new List<IMeasureGeoModel>(); //線段 1 的中點 var line1CP = getMidPoint(line1); //線段 1 的中點在線段 2 上的投影模型 var line1CPModel = getProjectionPlModel(line1CP, line2); modelList.Add(line1CPModel); //線段 1 起始點在線段 2 上的投影 var line1StartPoint = new MeasureViewModel() { Row1 = line1.Row1, Col1 = line1.Col1 }; var line1StartProjModel = getProjectionPlModel(line1StartPoint, line2); modelList.Add(line1StartProjModel); //線段 1 終點在線段 2 上的投影 var line1EndPoint = new MeasureViewModel() { Row1 = line1.Row2, Col1 = line1.Col2 }; var line1EndProjModel = getProjectionPlModel(line1EndPoint, line2); modelList.Add(line1EndProjModel); //線段 2 的中點 var line2CP = getMidPoint(line2); //線段 2 的中點在線段 1 上的投影 var line2CPProjModel = getProjectionPlModel(line2CP, line1); modelList.Add(line2CPProjModel); //線段 2 起始點在線段 1 上的投影 var line2StartPoint = new MeasureViewModel() { Row1 = line2.Row1, Col1 = line2.Col1 }; var line2StartProjModel = getProjectionPlModel(line2StartPoint, line1); modelList.Add(line2StartProjModel); //線段 2 終點在線段 1 上的投影 var line2EndPoint = new MeasureViewModel() { Row1 = line2.Row2, Col1 = line2.Col2 }; var line2EndProjModel = getProjectionPlModel(line2EndPoint, line1); modelList.Add(line2EndProjModel); //線段 shortestModel = modelList.OrderBy(p => p.Distance.D).Take(1).SingleOrDefault() as MeasureViewModel; } return shortestModel; }
/// <summary> /// 取得點到線的量測模型 /// </summary> /// <param name="firstModel"></param> /// <param name="secondModel"></param> /// <returns></returns> public static MeasureViewModel GetPointToLineMeasureModel(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { MeasureViewModel model = null; if (isMeasureModelValid(firstModel) && isMeasureModelValid(secondModel)) { var isLineModel = (_lineTypes.Contains(firstModel.GeoType)); var pointModel = (isLineModel) ? secondModel : firstModel; var lineModel = (isLineModel) ? firstModel : secondModel; //取得投影點 double projectionRow, projectionCol; getProjectionPoint(pointModel, lineModel, out projectionRow, out projectionCol); //計算距離 if (projectionRow > 0 && projectionCol > 0) { HTuple distanceMin; HOperatorSet.DistancePp(pointModel.Row1, pointModel.Col1, projectionRow, projectionCol, out distanceMin); model = new MeasureViewModel() { Distance = distanceMin, Row1 = pointModel.Row1, Col1 = pointModel.Col1, Row2 = projectionRow, Col2 = projectionCol, }; } } return model; }
public static MeasureViewModel Get3PointToCircleModel(IMeasureGeoModel pAModel , IMeasureGeoModel pBModel , IMeasureGeoModel pCModel) { MeasureViewModel model = null; var modelValid = isMeasureModelValid(pAModel) && isMeasureModelValid(pBModel) && isMeasureModelValid(pCModel); if (modelValid) { double circleX, circleY; caculateCenterOfCircle(pAModel, pBModel, pCModel, out circleX, out circleY); if (circleX > -1 && circleY > -1) { //radius HTuple radius; HOperatorSet.DistancePp(pAModel.Row1, pAModel.Col1, circleY, circleX, out radius); model = new MeasureViewModel() { Row1 = circleY, Col1 = circleX, Distance = radius, }; } } return model; }
/// <summary> /// 計算兩點 Y 方向距離 /// </summary> /// <param name="pointOne">點 1</param> /// <param name="pointTwo">點 2</param> /// <returns></returns> public static LineResult DistanceY(IMeasureGeoModel pointOne, IMeasureGeoModel pointTwo) { LineResult result = null; var modelValid = isMeasureModelValid(pointOne) && isMeasureModelValid(pointTwo); if (modelValid) { var distanceY = Math.Abs(pointOne.Row1.D - pointTwo.Row1.D); result = new LineResult() { Col1 = pointOne.Col1, Col2 = pointOne.Col1, Row1 = pointOne.Row1, Row2 = pointTwo.Row1, Distance = distanceY, }; } return result; }
public static bool IsResultType(IMeasureGeoModel model) { return(_resultTypes.Contains(model.GeoType)); }
/// <summary> /// 計算點到線的距離, 發生錯誤,則回傳 -1 /// </summary> /// <param name="firstModel">第一個 Model</param> /// <param name="secondModel">第二個 Model</param> /// <returns></returns> public static double PointToLine(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { double distance = -1; var model = GetPointToLineMeasureModel(firstModel, secondModel); if (model != null) { distance = model.Distance; } return distance; }
/// <summary> /// 計算線到線的距離,發生錯誤回傳 -1 /// </summary> /// <param name="firstModel"></param> /// <param name="secondModel"></param> /// <returns></returns> public static double LineToLine(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { var model = GetTwoLineShortestPointModel(firstModel, secondModel); double distance = (model != null) ? model.Distance.D : -1; return distance; }
public static bool IsPointType(IMeasureGeoModel model) { return _pointTypes.Contains(model.GeoType); }
/// <summary> /// 計算兩線段的交點 /// </summary> /// <param name="geoModelOne"></param> /// <param name="geoModelTwo"></param> /// <returns></returns> public static PointResult IntersetionLine(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo) { PointResult result = null; var modelValid = isMeasureModelValid(geoModelOne) && isMeasureModelValid(geoModelTwo) && isLineType(geoModelOne) && isLineType(geoModelTwo); if (modelValid) { HTuple row, col, isParallel; HOperatorSet.IntersectionLl(geoModelOne.Row1, geoModelOne.Col1, geoModelOne.Row2, geoModelOne.Col2, geoModelTwo.Row1, geoModelTwo.Col1, geoModelTwo.Row2, geoModelTwo.Col2, out row, out col, out isParallel); result = new PointResult() { Row1 = row, Col1 = col, IsParallel = isParallel, }; } return result; }
public static bool isLineType(IMeasureGeoModel model) { return(_lineTypes.Contains(model.GeoType)); }
public static bool IsPointType(IMeasureGeoModel model) { return(_pointTypes.Contains(model.GeoType)); }
public static bool isLineType(IMeasureGeoModel model) { return _lineTypes.Contains(model.GeoType); }
private static IMeasureGeoModel getMidPoint(IMeasureGeoModel line) { var midR = (line.Row1 + line.Row2) / 2.0; var midC = (line.Col1 + line.Col2) / 2.0; return new MeasureViewModel() { Row1 = new HTuple(midR), Col1 = new HTuple(midC), }; }
public static bool IsResultType(IMeasureGeoModel model) { return _resultTypes.Contains(model.GeoType); }
public static double PointToCircle(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { return PointToPoint(firstModel, secondModel); }
public MeasurementTwoLineCrossPoint(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo, MeasureAssistant mAssist) : base(null, mAssist) { initialize(geoModelOne, geoModelTwo, mAssist); }
/// <summary> /// 計算點到點的距離, 發生錯誤,則回傳 -1 /// </summary> /// <param name="pointA">點模型</param> /// <param name="pointB">點模型</param> /// <returns></returns> public static double PointToPoint(IMeasureGeoModel pointA, IMeasureGeoModel pointB) { double distance = -1; if (isMeasureModelValid(pointA) && isMeasureModelValid(pointB)) { HTuple distanceMin; HOperatorSet.DistancePp(pointA.Row1, pointA.Col1, pointB.Row1, pointB.Col1, out distanceMin); distance = distanceMin; } return distance; }
private void initialize(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo, MeasureAssistant mAssist) { _geoModelOne = geoModelOne; _geoModelTwo = geoModelTwo; ROIMeasureType = MeasureType.SymmetryLine; _ResultWorld = new LineResult(); UpdateResults(); }
public MeasurementDistanceY(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo, MeasureAssistant mAssist) : base(null, mAssist) { initialize(geoModelOne, geoModelTwo, mAssist); }
/// <summary> /// 取得兩線段之間最短的兩點模型 /// </summary> /// <param name="line1"></param> /// <param name="line2"></param> /// <returns>line model</returns> public static IMeasureGeoModel GetTwoLineShortestPointModel(IMeasureGeoModel line1, IMeasureGeoModel line2) { MeasureViewModel shortestModel = null; var modelValid = (isMeasureModelValid(line1) && isMeasureModelValid(line2)); if (modelValid) { var modelList = new List <IMeasureGeoModel>(); //線段 1 的中點 var line1CP = getMidPoint(line1); //線段 1 的中點在線段 2 上的投影模型 var line1CPModel = getProjectionPlModel(line1CP, line2); modelList.Add(line1CPModel); //線段 1 起始點在線段 2 上的投影 var line1StartPoint = new MeasureViewModel() { Row1 = line1.Row1, Col1 = line1.Col1 }; var line1StartProjModel = getProjectionPlModel(line1StartPoint, line2); modelList.Add(line1StartProjModel); //線段 1 終點在線段 2 上的投影 var line1EndPoint = new MeasureViewModel() { Row1 = line1.Row2, Col1 = line1.Col2 }; var line1EndProjModel = getProjectionPlModel(line1EndPoint, line2); modelList.Add(line1EndProjModel); //線段 2 的中點 var line2CP = getMidPoint(line2); //線段 2 的中點在線段 1 上的投影 var line2CPProjModel = getProjectionPlModel(line2CP, line1); modelList.Add(line2CPProjModel); //線段 2 起始點在線段 1 上的投影 var line2StartPoint = new MeasureViewModel() { Row1 = line2.Row1, Col1 = line2.Col1 }; var line2StartProjModel = getProjectionPlModel(line2StartPoint, line1); modelList.Add(line2StartProjModel); //線段 2 終點在線段 1 上的投影 var line2EndPoint = new MeasureViewModel() { Row1 = line2.Row2, Col1 = line2.Col2 }; var line2EndProjModel = getProjectionPlModel(line2EndPoint, line1); modelList.Add(line2EndProjModel); //線段 shortestModel = modelList.OrderBy(p => p.Distance.D).Take(1).SingleOrDefault() as MeasureViewModel; } return(shortestModel); }
/// <summary> /// 取得點到線的投影點模型 /// </summary> /// <param name="point"></param> /// <param name="line"></param> /// <returns>point to Projection point Model ( 2 point, projectionPoint at (col2, row2))</returns> private static IMeasureGeoModel getProjectionPlModel(IMeasureGeoModel point, IMeasureGeoModel line) { HTuple rowProj, colProj, distance; HOperatorSet.ProjectionPl(point.Row1, point.Col1, line.Row1, line.Col1, line.Row2, line.Col2 , out rowProj, out colProj); HOperatorSet.DistancePp(point.Row1, point.Col1, rowProj, colProj , out distance); MeasureViewModel model = new MeasureViewModel() { Row1 = new HTuple(point.Row1), Col1 = new HTuple(point.Col1), Row2 = new HTuple(rowProj), Col2 = new HTuple(colProj), Distance = new HTuple(distance), }; return model; }
public MeasurementSymmetryLine(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo, MeasureAssistant mAssist) : base(null, mAssist) { initialize(geoModelOne, geoModelTwo, mAssist); }
/// <summary> /// 檢查 Measure model 是否合法 /// </summary> /// <param name="model">IMeasureGeoModel</param> /// <returns></returns> private static bool isMeasureModelValid(IMeasureGeoModel model) { bool modelValid = false; bool pointParamCheckValid = ( model != null && model.Row1 != null && model.Col1 != null && model.Row1.TupleLength() > 0 && model.Col1.TupleLength() > 0 && model.Row1 > -1 && model.Col1 > -1); var isLineModel = _lineTypes.Contains(model.GeoType); if (isLineModel) { modelValid = pointParamCheckValid && ( model.Row2 != null && model.Col2 != null && model.Row2.TupleLength() > 0 && model.Col2.TupleLength() > 0 && model.Row2 > -1 && model.Col2 > -1); } else { modelValid = pointParamCheckValid; } return modelValid; }
private void initialize(IMeasureGeoModel geoModelOne, IMeasureGeoModel geoModelTwo, MeasureAssistant mAssist) { _geoModelOne = geoModelOne; _geoModelTwo = geoModelTwo; ROIMeasureType = MeasureType.Angle; //_Result = new AngleResult(); _ResultWorld = new AngleResult(); UpdateResults(); }
/// <summary> /// 計算兩元素距離 /// </summary> /// <param name="firstModel"></param> /// <param name="secondModel"></param> /// <returns></returns> public static MeasureViewModel CaculateDistance(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { int sum = 0; if (_pointTypes.Contains(firstModel.GeoType)) sum += 1; if (_pointTypes.Contains(secondModel.GeoType)) sum += 1; if (_lineTypes.Contains(firstModel.GeoType)) sum += 2; if (_lineTypes.Contains(secondModel.GeoType)) sum += 2; MeasureViewModel newModel = null; double distance = -1; switch (sum) { case 2: // Point to Point distance = PointToPoint(firstModel, secondModel); if (distance > -1) { newModel = new MeasureViewModel() { Distance = distance, Row1 = firstModel.Row1, Col1 = firstModel.Col1, Row2 = secondModel.Row1, Col2 = secondModel.Col1, }; } break; case 3: // Point to Line or line to point newModel = GetPointToLineMeasureModel(firstModel, secondModel); break; case 4: // line to line newModel = GetTwoLineShortestPointModel(firstModel, secondModel) as MeasureViewModel; break; } return newModel; }
/// <summary> /// 計算兩線段的對稱線 /// </summary> /// <param name="modelOne"></param> /// <param name="modelTwo"></param> /// <returns></returns> public static LineResult CalculateSymmetryLine(IMeasureGeoModel modelOne, IMeasureGeoModel modelTwo) { LineResult result = null; var modelValid = isMeasureModelValid(modelOne) && isMeasureModelValid(modelTwo); if (modelValid) { //取得第一條線段的中點 var pointModel = getMidPoint(modelOne); var lineModel = modelTwo; //計算第一線段中點到第二線段上的投影點(垂直距離) HTuple rowProj, colProj; HOperatorSet.ProjectionPl(pointModel.Row1, pointModel.Col1, lineModel.Row1, lineModel.Col1, lineModel.Row2, lineModel.Col2, out rowProj, out colProj); //計算第一線段中點與第二線段上的投影點距離 (point to point) HTuple distance; HOperatorSet.DistancePp(rowProj, colProj, pointModel.Row1, pointModel.Col1, out distance); //取兩線中點 var cRow = (pointModel.Row1 + rowProj) / 2.0; var cCol = (pointModel.Col1 + colProj) / 2.0; //取角度 HTuple angle; HOperatorSet.AngleLx(lineModel.Row1, lineModel.Col1, lineModel.Row2, lineModel.Col2, out angle); //線段 double[] rows, cols; DetermineLine(cRow, cCol, angle, distance, out rows, out cols); result = new LineResult() { Row1 = rows[0], Row2 = rows[1], Col1 = cols[0], Col2 = cols[1], Distance = distance, }; } return result; }
public static double LineToCircle(IMeasureGeoModel firstModel, IMeasureGeoModel secondModel) { return(PointToLine(firstModel, secondModel)); }