Skip to content
Snippets Groups Projects
PyramidFact.cs 4.15 KiB
Newer Older
  • Learn to ignore specific revisions
  • mariuskern's avatar
    mariuskern committed
    using Newtonsoft.Json;
    using REST_JSON_API;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    using UnityEngine.UIElements;
    
    /// <summary>
    /// Point in 3D Space
    /// </summary>
    public class PyramidFact : FactWrappedCRTP<PyramidFact>
    {
    
    
        //used points
        public string PidR, PidD;
    
        public Vector3 A, B, C, M, D, D_offset;
    
        public float ab;
        public float bc;
    
        public float Volume = 0.0F;
    
    
    
        public RectangleFact GetR {get =>  (RectangleFact)FactRecorder.AllFacts[PidR];}
        public PointFact GetD {get =>  (PointFact)FactRecorder.AllFacts[PidD];}
        protected void calculate_vectors(){
    
            A = GetR.A + Vector3.zero;
            B = GetR.B + Vector3.zero;
            C = GetR.C + Vector3.zero;
            D = GetD.Point + Vector3.zero;
    
    
    mariuskern's avatar
    mariuskern committed
            D_offset = Quaternion.AngleAxis(-90, Vector3.right) * (D - B);
    
    mariuskern's avatar
    mariuskern committed
    
            /*
            Vector3 d_AB = A + Vector3.Project(D - A, B - A);
            Vector3 d_BC = B + Vector3.Project(D - B, C - B);
    
            abPosition = Vector3.Distance(B, d_AB) / Vector3.Distance(B, A);
            bcPosition = Vector3.Distance(B, d_BC) / Vector3.Distance(B, C);
            */
    
            ab = (B - A).magnitude;
            bc = (C - B).magnitude;
    
            M = Vector3.ProjectOnPlane(D, Vector3.Cross(A - B, C - B));
    
            Volume = 1/3 * GetR.Area * Vector3.Distance(M, D);
    
    
    mariuskern's avatar
    mariuskern committed
            Position = B;
    
    mariuskern's avatar
    mariuskern committed
    
    
    mariuskern's avatar
    mariuskern committed
            Vector3 forward = Vector3.Cross((C - B), (A - B));
            Vector3 up = A - B;
    
            if ((A - B).y < 0)
            {
                up = -up;
            }
    
            Rotation = Quaternion.LookRotation(forward, up);
    
    mariuskern's avatar
    mariuskern committed
        }
    
        public PyramidFact() : base(){
            this.PidR = null;
            this.PidD = null;
        }
        [JsonConstructor]
        public PyramidFact( string PidT, string PidD) : base()
        {
            this.PidR = PidT;
            this.PidD = PidD;
    
            calculate_vectors();
        }
    
        /// <summary>
        /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
        /// <see cref="Normal"/> set to <c>Vector3.up</c>
        /// </summary>
        /// <param name="Point">sets <see cref="Point"/></param>
        /// <param name="ServerDefinition">MMT URI as OMS</param>
        public PyramidFact(string PidR, string PidD, SOMDoc ServerDefinition) : base()
        {
            this.PidR = PidR;
            this.PidD = PidD;
            
            this.ServerDefinition = ServerDefinition;
    
            calculate_vectors();
        }
    
        /// \copydoc Fact.parseFact(ScrollFact)
        public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
        {
            if (((MMTGeneralFact)fact).defines is not OMA df)
                yield break;
    
            OMS rectangleR, pointD;
    
            rectangleR = (OMS)df.arguments[0];
            pointD = (OMS)df.arguments[1];
    
            string PidR = rectangleR.uri;
            string PidD = pointD.uri;
    
            
    
            ret.Add(new PyramidFact(PidR, PidD));
    
            //ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri);
            //ret.Add(new PointFact(SOMDoc.MakeVector3(defines), fact.@ref));
        }
    
    
        /// \copydoc Fact.hasDependentFacts
        public override bool HasDependentFacts => true;
    
        /// \copydoc Fact.getDependentFactIds
        protected override string[] GetDependentFactIds()
            => new string[] { PidR, PidD};
    
        /// \copydoc Fact.GetHashCode
        /* public override int GetHashCode()
            => this.Point.GetHashCode();
        */
        protected override void RecalculateTransform()
        {
            calculate_vectors();
        }
        /// \copydoc Fact.Equivalent(Fact, Fact)
        protected override bool EquivalentWrapped(PyramidFact p1, PyramidFact p2){
    
    mariuskern's avatar
    mariuskern committed
            return DependentFactsEquivalent(p1, p2);
    
    mariuskern's avatar
    mariuskern committed
        }
    
        protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new){
            return new PyramidFact(this.PidR, this.PidD);
        }
    
        public override MMTFact MakeMMTDeclaration()
        {
            SOMDoc tp = new OMS(MMTConstants.PyramidType);
    
            return new MMTGeneralFact(_LastLabel, tp, Defines());
        }
    
        public override SOMDoc Defines()
            => new OMA(
                    new OMS(MMTConstants.PyramidCons),
                    new[] {
                        new OMS(PidR),
                        new OMS(PidD),
                    }
                );
    }