private G.Line trimLine_basepoint(G.Line extendedLine, G.Point fixedPoint) // this function is used by B vs C handler and does not know what edge it belongs to. Hence the 0.01 tambov { G.Line trimmedLine = extendedLine.Copy(); foreach (G.Edge eg in allEdges) { double o = _V_.X_CONCRETE_COVER_1 - _V_.X_TRIM_MINIMUM_DELTA; G.Line offsetLine = eg.edgeOffset(o, o, o); if (G.Line.hasIntersection(trimmedLine, offsetLine)) { G.Point ip = G.Line.getIntersectionPoint(trimmedLine, offsetLine); if (fixedPoint == extendedLine.End) { trimmedLine = new G.Line(ip, extendedLine.End); } else { trimmedLine = new G.Line(extendedLine.Start, ip); } } } return(trimmedLine); }
private bool trimmer_basepoint(G.Line extendedLine, G.Point fixedPoint, ref G.Edge trimmer) { bool trimmed = false; G.Line trimmedLine = extendedLine.Copy(); foreach (G.Edge eg in allEdges) { G.Line offsetLine = eg.edgeOffset(0, 0, 0); if (G.Line.hasIntersection(trimmedLine, offsetLine)) { G.Line interLine = eg.edgeOffset(0, 0, 0); G.Point ip = G.Line.getIntersectionPoint(trimmedLine, interLine); if (fixedPoint == extendedLine.End) { trimmedLine = new G.Line(ip, extendedLine.End); } else { trimmedLine = new G.Line(extendedLine.Start, ip); } trimmed = true; trimmer = eg; } } return(trimmed); }
//B HANDLE private bool B_vs_C_handler(G.Point mainPoint, G.Point mainEnd, G.Point sideStart, G.Edge e, G.Corner oc) { G.Line main = new G.Line(mainPoint, mainEnd); G.Line side = new G.Line(sideStart, mainPoint); G.Line temp1 = trimLine_basepoint(main, mainPoint); if (temp1.Length() > main.Length() * _V_.M_TRIM_TOLERANCE) { main = temp1.Copy(); } if (denier(main)) { return(false); } G.Line temp2 = trimLine_basepoint(side, mainPoint); if (temp2.Length() > side.Length() * _V_.M_TRIM_TOLERANCE) { side = temp2.Copy(); } if (denier(side)) { return(false); } if (main.Length() < _V_.Y_REINFORCEMENT_MAIN_RADIUS) { return(false); } if (side.Length() < _V_.Y_REINFORCEMENT_MAIN_RADIUS) { return(false); } G.Vector v1 = main.getDirectionVector(); G.Vector v2 = side.getDirectionVector(); double ang = G.Converter.AngleDeltaCW(v1, v2); if (Math.Abs(ang - Math.PI / 2) < _V_.M_B_BAR_TOLERANCE) { R.B_Raud reinf = new R.B_Raud(main, side, _V_.X_REINFORCEMENT_NUMBER, _V_.X_REINFORCEMENT_MAIN_DIAMETER, _V_.X_REINFORCEMENT_MARK); keep(reinf, e, oc, null); } else { R.C_Raud reinf = new R.C_Raud(main, side, _V_.X_REINFORCEMENT_NUMBER, _V_.X_REINFORCEMENT_MAIN_DIAMETER, _V_.X_REINFORCEMENT_MARK); keep(reinf, e, oc, null); } return(true); }
private G.Line trimLine_basepoint(G.Line extendedLine, G.Point fixedPoint, double offset, G.Edge e, ref G.Edge trimmer) { G.Line trimmedLine = extendedLine.Copy(); foreach (G.Edge eg in allEdges) { if (eg.Line.getOffsetVector() == e.Line.getOffsetVector()) { continue; } if (e.StartCorner.getOtherEdge(e) == eg && e.StartCorner.Angle > Math.PI) { continue; } if (e.EndCorner.getOtherEdge(e) == eg && e.EndCorner.Angle > Math.PI) { continue; } if (trimmedLine.getDirectionVector() == eg.Line.getDirectionVector()) { continue; } if (trimmedLine.getDirectionVector() == (-1) * eg.Line.getDirectionVector()) { continue; } double o = offset - _V_.X_TRIM_MINIMUM_DELTA; double so = _V_.X_CONCRETE_COVER_1 - _V_.X_TRIM_SIDE_MINIMUM_DELTA; if (e.StartCorner.getOtherEdge(e) == eg) { o = so; } if (e.EndCorner.getOtherEdge(e) == eg) { o = so; } G.Line offsetLine = eg.edgeTrimmer(o, so, so); if (G.Line.hasIntersection(trimmedLine, offsetLine)) { G.Point ip = G.Line.getIntersectionPoint(trimmedLine, offsetLine); if (ip == fixedPoint) { continue; } if (fixedPoint == extendedLine.End) { trimmedLine = new G.Line(ip, extendedLine.End); } else { trimmedLine = new G.Line(extendedLine.Start, ip); } trimmer = eg; } } return(trimmedLine); }
private void create_trimmed_short_A() { List <G.Edge> emptyEdges = allEdges.Where(x => !setEdges.Keys.Contains(x)).ToList(); emptyEdges = emptyEdges.OrderBy(b => b.Line.Length()).ToList(); foreach (G.Edge e in emptyEdges) { if (setEdges.Keys.Contains(e)) { continue; } if (narrow_denier(e)) { continue; } G.Edge temp = null; G.Line main = e.edgeOffset(_V_.X_CONCRETE_COVER_1, _V_.X_CONCRETE_COVER_1, _V_.X_CONCRETE_COVER_1); main = trimLine_baseline(main, main.Copy(), _V_.X_CONCRETE_COVER_2, e, ref temp); bool startTrimmed = false; G.Edge startTrimmerEdge = null; if (e.StartCorner.Angle > Math.PI) { G.Line extended = main.extendStart(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH); G.Line trimmed = trimLine_basepoint(extended, main.End, _V_.X_CONCRETE_COVER_2, e, ref startTrimmerEdge); if (trimmed.Length() < main.Length() + _V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * _V_.M_TRIM_TOLERANCE) { startTrimmed = true; } main = trimmed; } bool endTrimmed = false; G.Edge endTrimmerEdge = null; if (e.EndCorner.Angle > Math.PI) { G.Line extended = main.extendEnd(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH); G.Line trimmed = trimLine_basepoint(extended, main.Start, _V_.X_CONCRETE_COVER_2, e, ref endTrimmerEdge); if (trimmed.Length() < main.Length() + _V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * _V_.M_TRIM_TOLERANCE) { endTrimmed = true; } main = trimmed; } if (main.Length() <= _V_.Y_REINFORCEMENT_MAIN_MIN_LENGTH) { if (startTrimmed && endTrimmed) { bool got_D = define_D(e, startTrimmerEdge, endTrimmerEdge); if (got_D == false) { G.Vector v1 = main.getOffsetVector(); G.Vector v2 = startTrimmerEdge.Line.getCoolVector(v1); G.Vector v3 = endTrimmerEdge.Line.getCoolVector(v1); G.Point side1Point = main.Start.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.05, v2); G.Point side2Point = main.End.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.05, v3); G.Line side1 = new G.Line(side1Point, main.Start); G.Line side2 = new G.Line(main.End, side2Point); if (denier(side1) && denier(side2)) { G.Point AP = main.Start.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.5, v2); G.Line b_line = new G.Line(main.Start, AP); G.Edge side1TrimmerEdge = null; G.Line side1Main = trimLine_basepoint(b_line, main.Start, _V_.X_CONCRETE_COVER_2, e, ref side1TrimmerEdge); G.Point AP2 = main.End.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.5, v3); G.Line b_line2 = new G.Line(main.End, AP2); G.Edge side2TrimmerEdge = null; G.Line side2Main = trimLine_basepoint(b_line2, main.End, _V_.X_CONCRETE_COVER_2, e, ref side2TrimmerEdge); A_handler(main.Start, main.End, e, null, _V_.X_REINFORCEMENT_MAIN_DIAMETER); define_D(startTrimmerEdge, side1TrimmerEdge, e); define_D(endTrimmerEdge, e, side2TrimmerEdge); } else if (denier(side1)) { G.Point AP = main.Start.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.5, v2); G.Line b_line = new G.Line(main.Start, AP); G.Edge sideTrimmerEdge = null; G.Line newMain = trimLine_basepoint(b_line, main.Start, _V_.X_CONCRETE_COVER_2, e, ref sideTrimmerEdge); B_vs_C_handler(main.End, side2Point, main.Start, e, null); define_D(startTrimmerEdge, sideTrimmerEdge, e); } else if (denier(side2)) { G.Point AP = main.End.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.5, v2); G.Line b_line = new G.Line(main.End, AP); G.Edge sideTrimmerEdge = null; G.Line newMain = trimLine_basepoint(b_line, main.End, _V_.X_CONCRETE_COVER_2, e, ref sideTrimmerEdge); define_D(endTrimmerEdge, e, sideTrimmerEdge); B_vs_C_handler(main.Start, main.End, side1Point, e, null); } } } else if (startTrimmed) { bool got_B = define_B(e, startTrimmerEdge); if (got_B == false) { G.Vector v1 = e.Line.getOffsetVector(); G.Vector v2 = startTrimmerEdge.Line.getCoolVector(v1); G.Point AP = main.Start.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 2, v2); G.Line b_line = new G.Line(main.Start, AP); G.Edge sideTrimmerEdge = null; G.Line newMain = trimLine_basepoint(b_line, main.Start, _V_.X_CONCRETE_COVER_2, e, ref sideTrimmerEdge); if (sideTrimmerEdge != null) { bool got_D = define_D(startTrimmerEdge, sideTrimmerEdge, e); if (got_D) { A_handler(main.Start, main.End, e, null, _V_.X_REINFORCEMENT_MAIN_DIAMETER); } } else { G.Corner ec = e.EndCorner; if (ec.Angle < Math.PI) { G.Edge otherEdge = ec.getOtherEdge(e); define_D(e, startTrimmerEdge, otherEdge); } } } } else if (endTrimmed) { bool got_B = define_B(endTrimmerEdge, e); if (got_B == false) { G.Vector v1 = e.Line.getOffsetVector(); G.Vector v2 = endTrimmerEdge.Line.getCoolVector(v1); G.Point AP = main.End.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 2, v2); G.Line b_line = new G.Line(main.End, AP); G.Edge sideTrimmerEdge = null; G.Line newMain = trimLine_basepoint(b_line, main.End, _V_.X_CONCRETE_COVER_2, e, ref sideTrimmerEdge); if (sideTrimmerEdge != null) { bool got_D = define_D(endTrimmerEdge, e, sideTrimmerEdge); if (got_D) { A_handler(main.Start, main.End, e, null, _V_.X_REINFORCEMENT_MAIN_DIAMETER); } } else { G.Corner sc = e.StartCorner; if (sc.Angle < Math.PI) { G.Edge otherEdge = sc.getOtherEdge(e); define_D(e, otherEdge, endTrimmerEdge); } } } } } } }
private void create_trimmed_long_A() { List <G.Edge> emptyEdges = allEdges.Where(x => !setEdges.Keys.Contains(x)).ToList(); emptyEdges = emptyEdges.OrderBy(b => b.Line.Length()).Reverse().ToList(); foreach (G.Edge e in emptyEdges) { if (setEdges.Keys.Contains(e)) { continue; } if (narrow_denier(e)) { continue; } G.Edge temp = null; G.Line main = e.edgeOffset(_V_.X_CONCRETE_COVER_1, _V_.X_CONCRETE_COVER_1, _V_.X_CONCRETE_COVER_1); main = trimLine_baseline(main, main.Copy(), _V_.X_CONCRETE_COVER_1, e, ref temp); bool startTrimmed = false; G.Edge startTrimmerEdge = null; if (e.StartCorner.Angle > Math.PI) { G.Line extended = main.extendStart(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH); G.Line trimmed = trimLine_basepoint(extended, main.End, _V_.X_CONCRETE_COVER_2, e, ref startTrimmerEdge); if (trimmed.Length() < main.Length() + _V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * _V_.M_TRIM_TOLERANCE) { startTrimmed = true; } main = trimmed; } bool endTrimmed = false; G.Edge endTrimmerEdge = null; if (e.EndCorner.Angle > Math.PI) { G.Line extended = main.extendEnd(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH); G.Line trimmed = trimLine_basepoint(extended, main.Start, _V_.X_CONCRETE_COVER_2, e, ref endTrimmerEdge); if (trimmed.Length() < main.Length() + _V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * _V_.M_TRIM_TOLERANCE) { endTrimmed = true; } main = trimmed; } if (main.Length() > _V_.Y_REINFORCEMENT_MAIN_MIN_LENGTH) { A_handler(main.Start, main.End, e, null, _V_.X_REINFORCEMENT_MAIN_DIAMETER); if (startTrimmed) { bool got_B = define_simple_B(e, startTrimmerEdge); if (got_B == false) { G.Vector v1 = e.Line.getOffsetVector(); G.Vector v2 = startTrimmerEdge.Line.getCoolVector(v1); G.Point AP = main.Start.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.5, v2); G.Line b_line = new G.Line(main.Start, AP); G.Edge sideTrimmerEdge = null; G.Line newMain = trimLine_basepoint(b_line, main.Start, _V_.X_CONCRETE_COVER_2, e, ref sideTrimmerEdge); if (sideTrimmerEdge != null) { define_D(startTrimmerEdge, sideTrimmerEdge, e); } } } if (endTrimmed) { bool got_B = define_simple_B(endTrimmerEdge, e); if (got_B == false) { G.Vector v1 = e.Line.getOffsetVector(); G.Vector v2 = endTrimmerEdge.Line.getCoolVector(v1); G.Point AP = main.End.move(_V_.X_REINFORCEMENT_MAIN_ANCHOR_LENGTH * 1.5, v2); G.Line b_line = new G.Line(main.End, AP); G.Edge sideTrimmerEdge = null; G.Line newMain = trimLine_basepoint(b_line, main.End, _V_.X_CONCRETE_COVER_2, e, ref sideTrimmerEdge); if (sideTrimmerEdge != null) { define_D(endTrimmerEdge, e, sideTrimmerEdge); } } } } } }