Skip to content
Snippets Groups Projects
CuboidFact.cs 4.68 KiB
Newer Older
  • Learn to ignore specific revisions
  • Paul-Walcher's avatar
    Paul-Walcher committed
    using Newtonsoft.Json;
    using REST_JSON_API;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    
    /// <summary>
    /// Point in 3D Space
    /// </summary>
    public class CuboidFact : FactWrappedCRTP<CuboidFact>
    {
    
    
        //used points
        public string PidR, PidT;
        public Vector3 T;
        public RectangleFact RF = null;
    
    Paul-Walcher's avatar
    Paul-Walcher committed
        public float Volume = 0.0F;
    
    Paul-Walcher's avatar
    Paul-Walcher committed
    
    
        public RectangleFact GetR {get =>  (RectangleFact)FactRecorder.AllFacts[PidR];}
        public PointFact GetT {get =>  (PointFact)FactRecorder.AllFacts[PidT];}
        protected void calculate_vectors(){
    
            /*
            A = ((PointFact)FactRecorder.AllFacts[PidA]).Point + Vector3.zero;
            B = ((PointFact)FactRecorder.AllFacts[PidB]).Point + Vector3.zero;
            C = ((PointFact)FactRecorder.AllFacts[PidC]).Point + Vector3.zero;
            D = (A - B) + C;
    
            Area = (Vector3.Distance(A, B) * Vector3.Distance(B, C));
    
            Vector3 scale = new Vector3(Vector3.Distance(B, C), Vector3.Distance(A, B), 1.0F);
            
            LocalScale = scale * 0.5F;
    
            Position =  B + 0.5F*((A-B) + (C-B));
    
            Rotation = Quaternion.LookRotation(Vector3.Cross((A-B), (C-B)), Vector3.up);
            //Rotation = Quaternion.LookRotation(forward, new Vector3(1.0F, 0.0F, 0.0F));
            */   
    
            T = ((PointFact)FactRecorder.AllFacts[PidT]).Point + Vector3.zero;
            RF = ((RectangleFact)FactRecorder.AllFacts[PidR]);
    
    
    
    Paul-Walcher's avatar
    Paul-Walcher committed
            Vector3 A = RF.A, B = RF.B, C = RF.C;
    
            float sidelengthBA = Vector3.Distance(B, A);
            float sidelengthTB = Vector3.Distance(T, B);
            float sidelengthBC = Vector3.Distance(B, C);
    
    
    Paul-Walcher's avatar
    Paul-Walcher committed
            LocalScale = new Vector3(sidelengthBA+0.1F, sidelengthTB+0.1F, sidelengthBC+0.1F);
    
    
            Volume = sidelengthBA * sidelengthBC * sidelengthTB; 
    
    Paul-Walcher's avatar
    Paul-Walcher committed
    
            Position = B + 0.5F * ((A - B) + (T - B) + (C - B));
    
    
    Paul-Walcher's avatar
    Paul-Walcher committed
            Vector3 cross = Vector3.Cross((T - B), (A - B));
            Rotation = Quaternion.LookRotation(cross.normalized, (T - B).normalized);
    
    Paul-Walcher's avatar
    Paul-Walcher committed
            Rotation = Quaternion.identity;
    
    Paul-Walcher's avatar
    Paul-Walcher committed
        }
    
        public CuboidFact() : base(){
            this.PidR = null;
            this.PidT = null;
        }
        [JsonConstructor]
        public CuboidFact( string PidR, string PidT) : base()
        {
    
            this.PidR = PidR;
            this.PidT = PidT;
    
            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 CuboidFact(string PidR, string PidT, SOMDoc ServerDefinition) : base()
        {
      
    
            this.PidR = PidR;
            this.PidT = PidT;
    
            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, pointT;
    
            rectangleR = (OMS)df.arguments[0];
            pointT = (OMS)df.arguments[1];
    
            string PidR = rectangleR.uri;
            string PidT = pointT.uri;
    
            
    
    
    Paul-Walcher's avatar
    Paul-Walcher committed
            ret.Add(new CuboidFact(PidR, PidT));
    
    Paul-Walcher's avatar
    Paul-Walcher committed
    
            //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, PidT};
    
        /// \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(CuboidFact f1, CuboidFact f2){
            
            return (
    
                    Math3d.IsApproximatelyEqual(f1.T, f2.T)
                    && f1.RF.isEqual(f2.RF)
    
            );
    
        }
    
        protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new){
            
            return new CuboidFact(this.PidR, this.PidT);
    
        }
    
        public override MMTFact MakeMMTDeclaration()
        {
            SOMDoc tp = new OMS(MMTConstants.CuboidType);
    
            return new MMTGeneralFact(_LastLabel, tp, Defines());
        }
    
        public override SOMDoc Defines()
            => new OMA(
                    new OMS(MMTConstants.CuboidCons),
                    new[] {
                            new OMS(PidR),
                            new OMS(PidT)
                    }
                );
    }