Newer
Older
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 RectangleFact : FactWrappedCRTP<RectangleFact>
{
//used points
public string PidA, PidB, PidC;
public Vector3 A, B, C, D;
public PointFact GetA {get => (PointFact)FactRecorder.AllFacts[PidA];}
public PointFact GetB {get => (PointFact)FactRecorder.AllFacts[PidB];}
public PointFact GetC {get => (PointFact)FactRecorder.AllFacts[PidC];}
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));
public RectangleFact() : base(){
this.PidA = null;
this.PidB = null;
this.PidC = null;
}
[JsonConstructor]
public RectangleFact( string PidA, string PidB, string PidC) : base()
{
this.PidA = PidA;
this.PidB = PidB;
this.PidC = PidC;
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 RectangleFact(string PidA, string PidB, string PidC, SOMDoc ServerDefinition) : base()
{
this.PidA = PidA;
this.PidB = PidB;
this.PidC = PidC;
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 pointA, pointB, pointC;
pointA = (OMS)df.arguments[0];
pointB = (OMS)df.arguments[1];
pointC = (OMS)df.arguments[2];
string PidA = pointA.uri;
string PidB = pointB.uri;
string PidC = pointC.uri;
ret.Add(new RectangleFact(PidA, PidB, PidC));
//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[] { PidA, PidB, PidC};
/// \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(RectangleFact f1, RectangleFact f2){
return (
Math3d.IsApproximatelyEqual(f1.A, f2.A)
&& Math3d.IsApproximatelyEqual(f1.B, f2.B)
&& Math3d.IsApproximatelyEqual(f1.C, f2.C)
&& Math3d.IsApproximatelyEqual(f1.D, f2.D)
);
}
public bool isEqual(RectangleFact f2){
return EquivalentWrapped(this, f2);
}
protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new){
return new RectangleFact(this.PidA, this.PidB, this.PidC);
}
public override MMTFact MakeMMTDeclaration()
{
SOMDoc tp = new OMS(MMTConstants.RectangleType);
return new MMTGeneralFact(_LastLabel, tp, Defines());
}
public override SOMDoc Defines()
=> new OMA(
new OMS(MMTConstants.RectangleCons),
new[] {
new OMS(PidA),
new OMS(PidB),
new OMS(PidC),
}
);
}