void ModuleUpdatePerpendicular() { HLine HLN1 = VA.GetComponent <HLine>(); //対象となる直線1 HLine HLN2 = VB.GetComponent <HLine>(); //対象となる直線2 HypLine HL1 = HLN1.HL; HypLine HL2 = HLN2.HL; Vertex V11 = HLN1.VA.GetComponent <Vertex>(); Vertex V12 = HLN1.VB.GetComponent <Vertex>(); Vertex V21 = HLN2.VA.GetComponent <Vertex>(); Vertex V22 = HLN2.VB.GetComponent <Vertex>(); HypPoint P11 = new HypPoint(V11.XY); HypPoint P12 = new HypPoint(V12.XY); HypPoint P21 = new HypPoint(V21.XY); HypPoint P22 = new HypPoint(V22.XY); HypPoint C = HTransform.GetCrossingPointOfTwoHLines2(HL1, HL2); if (C != new HypPoint(1f, 1f, 0f)) { //float angle = HTransform.GetAngleOfTwoLines(HL1, HL2, C); float angle = HTransform.GetAngleOfTwoLines(P11, P12, P21, P22, C); //Debug.Log("angle="+angle); float error = (Mathf.PI / 2f - angle) * 0.25f; if (angle < 0f) { error = (-Mathf.PI / 2f - angle) * 0.25f; } HypPoint P1m = HTransform.GetMidPointOfTwoPoint(P11, P12); HypPoint P11T = HTransform.GetRotationOfPoint(P1m, -error, P11); HypPoint P12T = HTransform.GetRotationOfPoint(P1m, -error, P12); //HypLine L1T = HTransform.GetHLineThruTwoPoints(P11T, P12T); HypPoint P2m = HTransform.GetMidPointOfTwoPoint(P21, P22); HypPoint P21T = HTransform.GetRotationOfPoint(P2m, error, P21); HypPoint P22T = HTransform.GetRotationOfPoint(P2m, error, P22); //HypLine L2T = HTransform.GetHLineThruTwoPoints(P21T, P22T); if (!V11.Fixed && P11T.InWorld()) { V11.XY.x = P11T.GetX(); V11.XY.y = P11T.GetY(); } if (!V12.Fixed && P12T.InWorld()) { V12.XY.x = P12T.GetX(); V12.XY.y = P12T.GetY(); } if (!V21.Fixed && P21T.InWorld()) { V21.XY.x = P21T.GetX(); V21.XY.y = P21T.GetY(); } if (!V22.Fixed && P22T.InWorld()) { V22.XY.x = P22T.GetX(); V22.XY.y = P22T.GetY(); } } }
void ModuleUpdateAngle() { Vertex VtxA = VA.GetComponent <Vertex>(); // 対象となる点A Vertex VtxB = VB.GetComponent <Vertex>(); // 対象となる点B Vertex VtxC = VC.GetComponent <Vertex>(); // 対象となる点C float FinalAngle = Mathf.Abs(ParaA * Mathf.PI / 180f); // 対象となる角 HypPoint PA = new HypPoint(VtxA.XY); HypPoint PB = new HypPoint(VtxB.XY); HypPoint PC = new HypPoint(VtxC.XY); HypPoint PO = new HypPoint(0, 0); // Bを原点に移す写像を求める。 HypLine LA = HTransform.GetHBisectorOfTwoPoints(PB, PO); HypPoint PAA = HTransform.GetInversionAlongHLine(LA, PA); HypPoint PCC = HTransform.GetInversionAlongHLine(LA, PC); //角ABCを求める float DeclineA = Mathf.Atan2(PAA.GetY(), PAA.GetX()); float DeclineC = Mathf.Atan2(PCC.GetY(), PCC.GetX()); float AngleAC = DeclineC - DeclineA; if (AngleAC > Mathf.PI) { AngleAC -= (Mathf.PI * 2f); } if (AngleAC < -Mathf.PI) { AngleAC += (Mathf.PI * 2f); } // 修正する角度をもとめる。 float error = (AngleAC - FinalAngle) * 0.1f; if (AngleAC < 0) { error = (AngleAC + FinalAngle) * 0.1f; } //今一度点の取り直し。 {//線分ABのとりなおし PA = new HypPoint(VtxA.XY); PB = new HypPoint(VtxB.XY); HypPoint PM = HTransform.GetMidPointOfTwoPoint(PA, PB); LA = HTransform.GetHBisectorOfTwoPoints(PM, PO); HypPoint PPA = HTransform.GetInversionAlongHLine(LA, PA); HypPoint PPB = HTransform.GetInversionAlongHLine(LA, PB); HypPoint NewPPA = HTransform.GetRotationOfPoint(PO, error, PPA); HypPoint NewPPB = HTransform.GetRotationOfPoint(PO, error, PPB); HypPoint NewPA = HTransform.GetInversionAlongHLine(LA, NewPPA); HypPoint NewPB = HTransform.GetInversionAlongHLine(LA, NewPPB); if (!VtxA.Fixed && NewPA.InWorld()) { VtxA.XY.x = NewPA.GetX(); VtxA.XY.y = NewPA.GetY(); } if (!VtxB.Fixed && NewPB.InWorld()) { VtxB.XY.x = NewPB.GetX(); VtxB.XY.y = NewPB.GetY(); } } {//線分BCの取り直し PC = new HypPoint(VtxC.XY); PB = new HypPoint(VtxB.XY); HypPoint PM = HTransform.GetMidPointOfTwoPoint(PC, PB); LA = HTransform.GetHBisectorOfTwoPoints(PM, PO); HypPoint PPC = HTransform.GetInversionAlongHLine(LA, PC); HypPoint PPB = HTransform.GetInversionAlongHLine(LA, PB); HypPoint NewPPC = HTransform.GetRotationOfPoint(PO, -error, PPC); HypPoint NewPPB = HTransform.GetRotationOfPoint(PO, -error, PPB); HypPoint NewPC = HTransform.GetInversionAlongHLine(LA, NewPPC); HypPoint NewPB = HTransform.GetInversionAlongHLine(LA, NewPPB); if (!VtxC.Fixed && NewPC.InWorld()) { VtxC.XY.x = NewPC.GetX(); VtxC.XY.y = NewPC.GetY(); } if (!VtxB.Fixed && NewPB.InWorld()) { VtxB.XY.x = NewPB.GetX(); VtxB.XY.y = NewPB.GetY(); } } }