Пример #1
0
        public Edge_Curved(ref IEnumerable <Hare.Geometry.Point> SPT, ref IEnumerable <Hare.Geometry.Point> RPT, Environment.Medium_Properties Env_Props, Brep[] B, int[] Brep_Index, Curve i)
            : base(B, i)
        {
            //if (i.IsLinear()) throw new Exception("Curved Edge object called for straight edge.");
            //Rhino.RhinoDoc.ActiveDoc.Objects.AddCurve(i);
            ParentBreps = Brep_Index;

            //Get the open wedge angle. This needs the source location, and occlusion info...
            //Assuming tangent angles are always correctly oriented...
            //Vector Z_Dir = PointA - PointB;
            //double length = Z_Dir.Length();
            //Z_Dir.Normalize();
            //double MinAngle = double.PositiveInfinity;
            //Hare.Geometry.Point[] Dpt = new Hare.Geometry.Point[0];

            //Find the secondary source spacing DeltaZ
            /// 1/4 wavelength substituted for now...
            double fs = 88200; //Hz.
            //double DeltaZ = speed_of_sound / (fs * Math.Cos(MinAngle));//TODO: Adjust depending on distance from source to receiver... (nearest, farthest?

            /////
            //double El_Ct = Math.Ceiling(i.GetLength() / DeltaZ);
            //DeltaZ = i.GetLength() / El_Ct;
            //List<Point3d> Pts;
            double length       = Env_Props.Sound_Speed(i.PointAtStart) / (8 * fs);
            double total_length = i.GetLength();
            double t;

            //for (int j = 1; j < Pts.Length; j++)
            while (true)
            {
                if (!i.LengthParameter(length, out t))
                {
                    break;
                }
                Plane P;
                i.PerpendicularFrameAt(t, out P);
                Curve[]   Csects1, Csects2;
                Point3d[] Psects;

                //double DeltaZ = Env_Props.Sound_Speed(Point3d.Origin) / (4 * fs);
                Rhino.Geometry.Intersect.Intersection.BrepPlane(B[0], P, 0.001, out Csects1, out Psects);
                Rhino.Geometry.Intersect.Intersection.BrepPlane(B[1], P, 0.001, out Csects2, out Psects);
                Vector3d[] Tangents = new Vector3d[2];
                ///Control Start Point of curve
                if ((Csects1[0].PointAtStart.X * P.Origin.X + Csects1[0].PointAtStart.Y * P.Origin.Y + Csects1[0].PointAtStart.Z * P.Origin.Z) < 0.00001)
                {
                    Csects1[0].Reverse();
                }
                if ((Csects2[0].PointAtStart.X * P.Origin.X + Csects2[0].PointAtStart.Y * P.Origin.Y + Csects2[0].PointAtStart.Z * P.Origin.Z) < 0.00001)
                {
                    Csects2[0].Reverse();
                }
                ///Get Tangent Vector
                Tangents[0] = (Csects1[0].PointAtNormalizedLength(0.05) - P.Origin);
                Tangents[0].Unitize();
                Tangents[1] = (Csects2[0].PointAtNormalizedLength(0.05) - P.Origin);
                Tangents[1].Unitize();
                Hare.Geometry.Vector[] HTangents = new Hare.Geometry.Vector[2] {
                    new Hare.Geometry.Vector(Tangents[0].X, Tangents[0].Y, Tangents[0].Z), new Hare.Geometry.Vector(Tangents[1].X, Tangents[1].Y, Tangents[1].Z)
                };
                ///Get Normal
                double         up, vp;
                ComponentIndex CI;
                Point3d        outPt;
                Vector3d[]     Normals = new Vector3d[2];
                //Point3d CPT = Utilities.PachTools.HPttoRPt(Z_mid);
                B[0].ClosestPoint(P.Origin, out outPt, out CI, out up, out vp, 0.01, out Normals[0]);
                B[1].ClosestPoint(P.Origin, out outPt, out CI, out up, out vp, 0.01, out Normals[1]);
                Hare.Geometry.Vector[] HNormals = new Hare.Geometry.Vector[2] {
                    new Hare.Geometry.Vector(Normals[0].X, Normals[0].Y, Normals[0].Z), new Hare.Geometry.Vector(Normals[1].X, Normals[1].Y, Normals[1].Z)
                };
                //// Get Vector Tangents.
                //Hare.Geometry.Point Pt1 = new Hare.Geometry.Point(Pts[j-1].X, Pts[j-1].Y, Pts[j-1].Z);
                //Hare.Geometry.Point Pt2 = new Hare.Geometry.Point(Pts[j].X, Pts[j].Y, Pts[j].Z);
                double Delta_Z = Env_Props.Sound_Speed(P.Origin) / (4 * fs);//TODO: Adjust depending on distance from source to receiver... (nearest, farthest?)
                Sources.Add(new EdgeSource(Edge.Rigid, Utilities.PachTools.RPttoHPt(P.Origin), Delta_Z, HTangents));

                length += Delta_Z;
            }
        }
Пример #2
0
        public Edge_Curved(ref IEnumerable <Hare.Geometry.Point> SPT, ref IEnumerable <Hare.Geometry.Point> RPT, bool issoft, double EdgeLength, Environment.Medium_Properties Att_Props, MathNet.Numerics.Interpolation.CubicSpline[] Edge_Crv, MathNet.Numerics.Interpolation.CubicSpline[] TangentA, MathNet.Numerics.Interpolation.CubicSpline[] TangentB)
        {
            //Find the secondary source spacing DeltaZ
            double fs     = 176400; //Hz.
            double DeltaZ = 0;
            Point  pt1    = new Point(Edge_Crv[0].Interpolate(0), Edge_Crv[1].Interpolate(0), Edge_Crv[2].Interpolate(0));
            Vector Z_Dir  = pt1 - new Point(Edge_Crv[0].Interpolate(0.001), Edge_Crv[1].Interpolate(0.001), Edge_Crv[2].Interpolate(0.001));

            Z_Dir.Normalize();
            List <Hare.Geometry.Point> Dpt = new List <Hare.Geometry.Point>();

            //Find the secondary source spacing DeltaZ
            //Dpt.AddRange(RPT);
            //Dpt.AddRange(SPT);

            double i = 0;

            do
            {
                double MinAngle = double.NegativeInfinity;

                foreach (Point spt in SPT)
                {
                    foreach (Point pt in RPT)
                    {
                        Vector D1 = (pt1 - pt);
                        Vector D2 = (pt1 - spt);
                        D1.Normalize(); D2.Normalize();
                        double angle = Math.Abs(Hare_math.Dot((D2 + D1) / 2, Z_Dir));
                        if (angle > MinAngle)
                        {
                            MinAngle = angle;
                        }
                    }
                }
                DeltaZ = Att_Props.Sound_Speed(pt1) / (fs * MinAngle);

                i += DeltaZ;
                if (i > EdgeLength)
                {
                    break;
                }
                Hare.Geometry.Point pt2 = new Point(Edge_Crv[0].Interpolate(i), Edge_Crv[1].Interpolate(i), Edge_Crv[2].Interpolate(i));
                Sources.Add(new EdgeSource(Edge.Rigid, pt1, pt2, new Vector[2] {
                    new Vector(TangentA[0].Interpolate(i), TangentA[1].Interpolate(i), TangentA[2].Interpolate(i)), new Vector(TangentA[3].Interpolate(i), TangentA[4].Interpolate(i), TangentA[5].Interpolate(i))
                }));
                pt1 = pt2;
            } while (true);
        }
Пример #3
0
        public Edge_Straight(ref IEnumerable <Hare.Geometry.Point> SPT, ref IEnumerable <Hare.Geometry.Point> RPT, Environment.Medium_Properties Att_Props, Rhino.Geometry.Brep[] Brep, int[] Brep_Index, Curve Be)
            : base(Brep, Be)
        {
            //Rhino.RhinoDoc.ActiveDoc.Objects.Add(Brep[0]);
            //Rhino.RhinoDoc.ActiveDoc.Objects.Add(Brep[1]);
            ParentBreps = Brep_Index;
            //Rhino.RhinoDoc.ActiveDoc.Objects.AddCurve(Be);

            //if (!Brep.Edges[edge_id].IsLinear()) throw new Exception("Straight_Edge object called for curved edge.");
            Rhino.Geometry.Point3d PA = Be.PointAtStart;
            Rhino.Geometry.Point3d PB = Be.PointAtEnd;
            PointA = Utilities.PachTools.RPttoHPt(PA);
            PointB = Utilities.PachTools.RPttoHPt(PB);

            //Get the open wedge angle. This needs the source location, and occlusion info...
            //Assuming tangent angles are always correctly oriented...
            Vector Z_Dir  = PointA - PointB;
            double length = Z_Dir.Length();

            Z_Dir.Normalize();
            double MinAngle = double.PositiveInfinity;
            List <Hare.Geometry.Point> Dpt = new List <Hare.Geometry.Point>();

            //Find the secondary source spacing DeltaZ
            Dpt.AddRange(RPT);
            Dpt.AddRange(SPT);

            for (int j = 0; j < Dpt.Count; j++)
            {
                double angle = Math.Abs(Hare_math.Dot(PointA - Dpt[j], Z_Dir));
                if (angle < MinAngle)
                {
                    MinAngle = angle;
                }
                angle = Math.Abs(Hare_math.Dot(PointB - Dpt[j], Z_Dir));
                if (angle < MinAngle)
                {
                    MinAngle = angle;
                }
            }
            double fs     = 176400;                                               //Hz.
            double DeltaZ = Att_Props.Sound_Speed(this.PointA) / (fs * MinAngle); //TODO: Adjust depending on distance from source to receiver... (nearest, farthest?)

            double El_Ct = Math.Ceiling(length / DeltaZ);

            DeltaZ = length / El_Ct;

            Random r = new Random();

            Plane P;

            Curve[]   Csects1;
            Curve[]   Csects2;
            Point3d[] Psects;

            //for (;;)
            //{
            double t = r.NextDouble() * (Be.Domain.Max - Be.Domain.Min) + Be.Domain.Min;

            Be.PerpendicularFrameAt(t, out P);

            Rhino.Geometry.Intersect.Intersection.BrepPlane(Brep[0], P, 0.1, out Csects1, out Psects);
            Rhino.Geometry.Intersect.Intersection.BrepPlane(Brep[1], P, 0.1, out Csects2, out Psects);

            //if (Csects1 != null && Csects2 != null && Csects1.Length > 0 && Csects2.Length > 0) break;

            //Rhino.RhinoDoc.ActiveDoc.Objects.Add(Csects1[0]);
            //Rhino.RhinoDoc.ActiveDoc.Objects.Add(Csects2[0]);
            //}

            Vector3d[] Tangents = new Vector3d[2];
            ///Control Start Point of curve
            if ((Csects1[0].PointAtStart.X * P.Origin.X + Csects1[0].PointAtStart.Y * P.Origin.Y + Csects1[0].PointAtStart.Z * P.Origin.Z) < 0.00001)
            {
                Csects1[0].Reverse();
            }
            if ((Csects2[0].PointAtStart.X * P.Origin.X + Csects2[0].PointAtStart.Y * P.Origin.Y + Csects2[0].PointAtStart.Z * P.Origin.Z) < 0.00001)
            {
                Csects2[0].Reverse();
            }
            ///Get Tangent Vector
            Tangents[0] = (Csects1[0].PointAtNormalizedLength(0.05) - P.Origin);
            Tangents[0].Unitize();
            Tangents[1] = (Csects2[0].PointAtNormalizedLength(0.05) - P.Origin);
            Tangents[1].Unitize();
            Hare.Geometry.Vector[] HTangents = new Hare.Geometry.Vector[2] {
                new Hare.Geometry.Vector(Tangents[0].X, Tangents[0].Y, Tangents[0].Z), new Hare.Geometry.Vector(Tangents[1].X, Tangents[1].Y, Tangents[1].Z)
            };
            ///Get Normal
            double         up, vp;
            ComponentIndex CI;
            Point3d        outPt;

            Vector3d[] Normals = new Vector3d[2];
            Brep[0].ClosestPoint(P.Origin, out outPt, out CI, out up, out vp, 0.01, out Normals[0]);
            Brep[1].ClosestPoint(P.Origin, out outPt, out CI, out up, out vp, 0.01, out Normals[1]);
            Hare.Geometry.Vector[] HNormals = new Hare.Geometry.Vector[2] {
                new Hare.Geometry.Vector(Normals[0].X, Normals[0].Y, Normals[0].Z), new Hare.Geometry.Vector(Normals[1].X, Normals[1].Y, Normals[1].Z)
            };
            Hare.Geometry.Point Pt1 = new Hare.Geometry.Point(PointA.x, PointA.y, PointA.z);

            //TODO - Modify DeltaZ per change in velocity.
            for (int i = 1; i < El_Ct; i++)
            {
                Hare.Geometry.Point Pt2 = PointA - i * Z_Dir * DeltaZ;
                Sources.Add(new EdgeSource(Edge.Rigid, Pt1, Pt2, HTangents));
                //HTangents[1]*= -1;
                //Sources.Add(new EdgeSource(Edge.Rigid, Pt1, Pt2, HTangents));
                Pt1 = Pt2;
            }
        }
Пример #4
0
        public Edge_Straight(ref IEnumerable <Hare.Geometry.Point> SPT, ref IEnumerable <Hare.Geometry.Point> RPT, Environment.Medium_Properties Att_Props, bool isSoft, Hare.Geometry.Point[] PointS, MathNet.Numerics.Interpolation.CubicSpline[] TangentA, MathNet.Numerics.Interpolation.CubicSpline[] TangentB)
        {
            PointA = PointS[0];
            PointB = PointS[PointS.Length - 1];

            //Get the open wedge angle. This needs the source location, and occlusion info...
            //Assuming tangent angles are always correctly oriented...
            Vector Z_Dir  = PointA - PointB;
            double length = Z_Dir.Length();

            Z_Dir.Normalize();
            //double MinAngle = double.PositiveInfinity;
            List <Hare.Geometry.Point> Dpt = new List <Hare.Geometry.Point>();

            //Find the secondary source spacing DeltaZ
            Dpt.AddRange(RPT);
            Dpt.AddRange(SPT);

            //for (int j = 0; j < Dpt.Count; j++)
            //{
            //    double angle = Math.Abs(Hare_math.Dot(PointA - Dpt[j], Z_Dir));
            //    if (angle < MinAngle) MinAngle = angle;
            //    angle = Math.Abs(Hare_math.Dot(PointB - Dpt[j], Z_Dir));
            //    if (angle < MinAngle) MinAngle = angle;
            //}
            double fs = 176400; //Hz.
            //double DeltaZ = Att_Props.Sound_Speed(this.PointA) / (fs * MinAngle);//TODO: Adjust depending on distance from source to receiver... (nearest, farthest?)

            //double El_Ct = Math.Ceiling(length / DeltaZ);
            //DeltaZ = length / El_Ct;

            Random r = new Random();

            Hare.Geometry.Point Pt1 = new Hare.Geometry.Point(PointA.x, PointA.y, PointA.z);

            //TODO - Modify DeltaZ per change in velocity.
            //for (int i = 1; i < El_Ct; i++)
            //{
            //    Hare.Geometry.Point Pt2 = PointA - i * Z_Dir * DeltaZ;
            //    Sources.Add(new EdgeSource(Edge.Rigid, Pt1, Pt2, HTangents));
            //    //HTangents[1]*= -1;
            //    //Sources.Add(new EdgeSource(Edge.Rigid, Pt1, Pt2, HTangents));
            //    Pt1 = Pt2;
            //}
            Point  pt1    = PointA;
            double DeltaZ = 0;

            //for (int i = 1; i < El_Ct; i++)
            for (double i = 0; i < length; i += DeltaZ)
            {
                double MinAngle = double.PositiveInfinity;
                foreach (Point pt in Dpt)
                {
                    double angle = Math.Abs(Hare_math.Dot(PointA - pt, Z_Dir));
                    if (angle < MinAngle)
                    {
                        MinAngle = angle;
                    }
                }
                DeltaZ = Att_Props.Sound_Speed(pt1) / (fs * MinAngle);
                Hare.Geometry.Point Pt2 = PointA - Z_Dir * i;
                Sources.Add(new EdgeSource(Edge.Rigid, Pt1, Pt2, new Vector[2] {
                    new Vector(TangentA[0].Interpolate(i), TangentA[1].Interpolate(i), TangentA[2].Interpolate(i)), new Vector(TangentB[0].Interpolate(i), TangentB[1].Interpolate(i), TangentB[2].Interpolate(i))
                }));
                Pt1 = Pt2;
            }
        }