/// <summary> /// Interpolate values from source node values to target points. /// </summary> private double InterpolateNodeToTarget(float[] nodeValues, int i) { double delVal = DeleteValueFloat; InterpNodeData w = _targetsNode[i]; int elmtIndex = w.ElementIndex; if (elmtIndex < 0) { // target not included in source return(delVal); } if (_smesh == null) { throw new NotSupportedException("Node interpolation is only supported by SMeshData objects"); } int[] elmtNodes = _smesh.ElementTable[elmtIndex]; double res; if (elmtNodes.Length == 3) { double v1 = nodeValues[elmtNodes[0]]; double v2 = nodeValues[elmtNodes[1]]; double v3 = nodeValues[elmtNodes[2]]; res = _interpT.GetValue(w.w1, w.w2, w.w3, v1, v2, v3); } else { double v1 = nodeValues[elmtNodes[0]]; double v2 = nodeValues[elmtNodes[1]]; double v3 = nodeValues[elmtNodes[2]]; double v4 = nodeValues[elmtNodes[3]]; res = _interpQ.GetValue(w.w1, w.w2, v1, v2, v3, v4); } return(res); }
/// <summary> /// Add a target, by specifying its (x,y) coordinate. /// </summary> private void AddSTarget(double x, double y) { // Find element that includes the (x,y) coordinate int element = _ssearcher.FindElement(x, y); // Setup interpolation from node values if (NodeValueInterpolation) { InterpNodeData interp; if (element >= 0) { int[] nodes = _smesh.ElementTable[element]; if (nodes.Length == 3) { var weights = InterpTriangle.InterpolationWeights(x, y, _smesh, nodes); interp = new InterpNodeData(element, weights.w1, weights.w2, weights.w3); } else if (nodes.Length == 4) { var weights = InterpQuadrangle.InterpolationWeights(x, y, _smesh, nodes); interp = new InterpNodeData(element, weights.dx, weights.dy); } else { interp = InterpNodeData.Undefined(); } } else { interp = InterpNodeData.Undefined(); } if (_targetsNode == null) { _targetsNode = new List <InterpNodeData>(); } _targetsNode.Add(interp); } // Setup interpolation from element+node values if (ElmtNodeValueInterpolation) { InterpElmtNode.Weights weights; // Check if element has been found, i.e. includes the (x,y) point if (element >= 0) { weights = InterpElmtNode.InterpolationWeights(x, y, element, _smesh); } else { weights = InterpElmtNode.Undefined(); } if (_targetsElmtNode == null) { _targetsElmtNode = new List <InterpElmtNode.Weights>(); } _targetsElmtNode.Add(weights); } }
/// <summary> /// Add a target, by specifying its (x,y) coordinate. /// </summary> public void AddTarget(double x, double y) { if (_mesh == null) { AddSTarget(x, y); return; } // Find element that includes the (x,y) coordinate MeshElement element = _searcher.FindElement(x, y); // Setup interpolation from node values if (NodeValueInterpolation) { InterpNodeData interp; // Check if element has been found, i.e. includes the (x,y) point if (element != null) { var nodes = element.Nodes; if (nodes.Count == 3) { var weights = InterpTriangle.InterpolationWeights(x, y, nodes); interp = new InterpNodeData(element.Index, weights.w1, weights.w2, weights.w3); } else if (nodes.Count == 4) { var weights = InterpQuadrangle.InterpolationWeights(x, y, nodes); interp = new InterpNodeData(element.Index, weights.dx, weights.dy); } else { interp = InterpNodeData.Undefined(); } } else { interp = InterpNodeData.Undefined(); } if (_targetsNode == null) { _targetsNode = new List <InterpNodeData>(); } _targetsNode.Add(interp); } // Setup interpolation from element+node values if (ElmtNodeValueInterpolation) { InterpElmtNode.Weights weights; // Check if element has been found, i.e. includes the (x,y) point if (element != null) { weights = InterpElmtNode.InterpolationWeights(x, y, element); } else { weights = InterpElmtNode.Undefined(); } if (_targetsElmtNode == null) { _targetsElmtNode = new List <InterpElmtNode.Weights>(); } _targetsElmtNode.Add(weights); } }