unsafe void WarpingAlgorithm.WarpImage(MarkerSet markerSet, Morphing.ImageData inputImage, Morphing.ImageData outputImage, bool startImage) { System.Diagnostics.Debug.Assert(markerSet != null && inputImage != null && outputImage != null); PointMarkerSet pointMarkerSet = markerSet as PointMarkerSet; System.Diagnostics.Debug.Assert(pointMarkerSet != null); // minor precomputation - movevector & interppos (for more mem consistency) WarpMarker[] markers; if (startImage) { markers = pointMarkerSet.Points.Select(x => new WarpMarker { CurrentPos = x.InterpolatedMarker, MoveVec = x.StartMarker - x.InterpolatedMarker }).ToArray(); } else { markers = pointMarkerSet.Points.Select(x => new WarpMarker { CurrentPos = x.InterpolatedMarker, MoveVec = x.EndMarker - x.InterpolatedMarker }).ToArray(); } double xStep = 1.0 / outputImage.Width; if (markers.Length == 0) return; Parallel.For(0, outputImage.Height, yi => { Color* outputDataPixel = outputImage.Data + yi * outputImage.Width; Color* lastOutputDataPixel = outputDataPixel + outputImage.Width; double y = (double)yi / outputImage.Height; for (double x = 0; outputDataPixel != lastOutputDataPixel; x += xStep, ++outputDataPixel) { Vector position = new Vector(x, y); Vector displacement = new Vector(0,0); // fixed ptr won't work inside loop! // for(WarpMarker* pMarker = pMarkerFirst; pMarker != pMarkerEnd; ++pMarker) double weightSum = 0.0f; foreach (var marker in markers) { double distSq = (position - marker.CurrentPos).LengthSquared; double weight = Math.Exp(-distSq / POINT_WEIGHT);//1.0f / (1.0f + distSq / POINT_WEIGHT); // inverse quadratic! weightSum += weight; displacement += marker.MoveVec * weight; } displacement /= weightSum; position += displacement; position = position.ClampToImageArea(); *outputDataPixel = inputImage.Sample(position.X, position.Y); } }); }
unsafe void WarpingAlgorithm.WarpImage(MarkerSet markerSet, Morphing.ImageData inputImage, Morphing.ImageData outputImage, bool startImage) { System.Diagnostics.Debug.Assert(markerSet != null && inputImage != null && outputImage != null); LineMarkerSet lineMarkerSet = markerSet as LineMarkerSet; System.Diagnostics.Debug.Assert(lineMarkerSet != null); double xStep = 1.0 / outputImage.Width; WarpMarker[] markers; if (startImage) { markers = lineMarkerSet.Lines.Select(x => new WarpMarker { target_start = x.InterpolatedMarker.Start, target_dirNorm = x.InterpolatedMarker.End - x.InterpolatedMarker.Start, target_perpendicNorm = (x.InterpolatedMarker.End - x.InterpolatedMarker.Start).Perpendicular(), target_lineLength = (x.InterpolatedMarker.End - x.InterpolatedMarker.Start).Length, dest_start = x.StartMarker.Start, dest_dirNorm = x.StartMarker.End - x.StartMarker.Start, dest_perpendicNorm = (x.StartMarker.End - x.StartMarker.Start).Perpendicular(), }).ToArray(); } else { markers = lineMarkerSet.Lines.Select(x => new WarpMarker { target_start = x.InterpolatedMarker.Start, target_dirNorm = x.InterpolatedMarker.End - x.InterpolatedMarker.Start, target_perpendicNorm = (x.InterpolatedMarker.End - x.InterpolatedMarker.Start).Perpendicular(), target_lineLength = (x.InterpolatedMarker.End - x.InterpolatedMarker.Start).Length, dest_start = x.EndMarker.Start, dest_dirNorm = x.EndMarker.End - x.EndMarker.Start, dest_perpendicNorm = (x.EndMarker.End - x.EndMarker.Start).Perpendicular(), }).ToArray(); } for (int markerIdx = 0; markerIdx < markers.Length; ++markerIdx) { // markers[markerIdx].target_dirLength = markers[markerIdx].target_dir.Length; markers[markerIdx].target_perpendicNorm.Normalize(); markers[markerIdx].target_dirNorm.Normalize(); markers[markerIdx].dest_perpendicNorm.Normalize(); markers[markerIdx].dest_dirNorm.Normalize(); } if (markers.Length == 0) return; Parallel.For(0, outputImage.Height, yi => { Color* outputDataPixel = outputImage.Data + yi * outputImage.Width; Color* lastOutputDataPixel = outputDataPixel + outputImage.Width; double y = (double)yi / outputImage.Height; for (double x = 0; outputDataPixel != lastOutputDataPixel; x += xStep, ++outputDataPixel) { Vector position = new Vector(x, y); Vector displacement = new Vector(0, 0); double weightSum = 0.0f; for (int markerIdx = 0; markerIdx < markers.Length; ++markerIdx) { Vector toStart = position - markers[markerIdx].target_start; // calc relative coordinates to line double u = toStart.Dot(markers[markerIdx].target_dirNorm); double v = toStart.Dot(markers[markerIdx].target_perpendicNorm); // calc weight double weight; if (u < 0) // bellow weight = toStart.LengthSquared; else if (u > 1) // above weight = (toStart + markers[markerIdx].target_dirNorm * markers[markerIdx].target_lineLength).LengthSquared; else // beside weight = v * v; weight = Math.Exp(-weight / LINE_WEIGHT); //Math.Pow(markers[markerIdx].target_lineLength / (A + weight), B); weightSum += weight; // translation Vector srcPoint = markers[markerIdx].dest_start + u * markers[markerIdx].dest_dirNorm + v * markers[markerIdx].dest_perpendicNorm; displacement += (srcPoint - position) * weight; } displacement /= weightSum; position += displacement; position = position.ClampToImageArea(); *outputDataPixel = inputImage.Sample(position.X, position.Y); } }); }
public string AsLimitableStringWithTypes(bool withExampleInfo, bool threeLines, int maxLength = 600) { string nl = threeLines ? Environment.NewLine + " " : ""; string exampleInfo = withExampleInfo ? ExampleInfo : null; string markers = MarkerSet.AsFullString(maxLength / 3); return($"{UsingItem.AsFullString(maxLength / 3)} " + nl + $"{DIP_ARROW} {markers};{Ct};{QuestionableCt};{BadCt};{Source?.AsDipString()};{exampleInfo} " + nl + $"{DIP_ARROW} {UsedItem.AsFullString(maxLength / 3)}"); }
/// <summary> /// Produces a copy of this <c>MarkerSet</c>. /// The new instance does not belong to any <c>ZeroitAsanaCompass</c>. /// </summary> /// <returns>A new <c>MarkerSet</c>.</returns> public MarkerSet Clone() { MarkerSet ms = new MarkerSet(angle); for (int i = 0; i < markers.Count; i++) { Marker m = markers[i].Clone(); ms.Add(m); } return(ms); }
/// <summary> /// A message presented to the user if this Dependency has a <see cref="BadCt"/>or <see cref="QuestionableCt"/>. /// </summary> /// <returns></returns> public string NotOkMessage(bool simpleRuleOutput, bool newLine, int maxLength = 600) { if (simpleRuleOutput) { return($"{UsingItem.AsString()} ---? {UsedItem.AsString()}"); } else { string prefix = BadCt > 0 ? QuestionableCt > 0 ? "Bad and questionable d" : "Bad d" : QuestionableCt > 0 ? "Questionable d" : "D"; string nounTail = Ct > 1 ? "ependencies" : "ependency"; string reason = string.IsNullOrWhiteSpace(NotOkReason) ? "" : " detected by " + NotOkReason; string brk = newLine ? Environment.NewLine + " " : ""; string ct = BadCt > 0 ? QuestionableCt > 0 ? $";{QuestionableCt};{BadCt}" : $";;{BadCt}" : QuestionableCt > 0 ? $";{QuestionableCt};" : ";;"; string markers = MarkerSet.AsFullString(maxLength / 3); return ($"{prefix}{nounTail}{reason}: {brk}{UsingItem.AsFullString(maxLength / 3)}{brk}-- {ct}{markers}{brk}-> {UsedItem.AsFullString(maxLength / 3)}" + (Source != null ? $" {brk}" + (Ct > 1 ? "(e.g. at " : "(at ") + Source + ")" : "") + (newLine ? Environment.NewLine : "")); } }
public static void Main(String[] args) { SWTest.WriteLine("Start test"); WordList wl = new WordList(false); Literal keywords = new Literal("alpha \u00a8theta gamma"); wl.Set(keywords.Data(), keywords.Length()); Literal alpha = new Literal("alpha"); Literal theta = new Literal("\u00a8theta"); Literal gamma = new Literal("gamma"); Literal delta = new Literal("delta"); Literal large = new Literal("\u00a0large"); if (wl.InList(alpha.Data(), 0, alpha.Length())) { SWTest.Write("Contains alpha"); } else { SWTest.Write("Does not contain alpha"); } SWTest.Write("\n"); if (wl.InList(theta.Data(), 0, theta.Length())) { SWTest.Write("Contains theta"); } else { SWTest.Write("Does not contain theta"); } SWTest.Write("\n"); if (wl.InList(gamma.Data(), 0, gamma.Length())) { SWTest.Write("Contains gamma"); } else { SWTest.Write("Does not contain beta"); } SWTest.Write("\n"); if (wl.InList(delta.Data(), 0, delta.Length())) { SWTest.Write("Contains delta"); } else { SWTest.Write("Does not contain delta"); } SWTest.Write("\n"); if (wl.InList(large.Data(), 0, large.Length())) { SWTest.Write("Contains large"); } else { SWTest.Write("Does not contain large"); } SWTest.Write("\n"); testUndoRedo(); SplitVector_1 buffer = new SplitVector_1(); buffer.Create(20, 100); SWTest.Assert(buffer.Length() == 0); Literal test = new Literal("abcde"); try { buffer.InsertString(1, test.Data(), 1); } catch (BadPositionException) { SWTest.Write("Caught\n"); } int lenTest = test.Length(); buffer.InsertString(0, test.Data(), lenTest); SWTest.Assert(buffer.Length() == lenTest); byte[] ret = new byte[3]; buffer.RetrieveString(1, ret, 3); for (int h = 0; h < 3; h++) { SWTest.Assert(ret[h] == test.CharAt(h + 1)); } for (int i = 0; i < lenTest; i++) { SWTest.Assert(test.CharAt(i) == buffer.CharAt(i)); SWTest.Write(i); SWTest.Write(":"); SWTest.Write(buffer.CharAt(i)); SWTest.Write(" "); } SWTest.Write("\n"); buffer.DeleteRange(1, 2); SWTest.Assert(buffer.Length() == lenTest - 2); //for (int j = -1; j < buffer.Length() + 1; j++) { for (int j = 0; j < buffer.Length(); j++) { SWTest.Write(j); SWTest.Write("="); SWTest.Write(buffer.CharAt(j)); SWTest.Write(" "); } SWTest.Write("\n"); Literal shortInsert = new Literal("bc"); buffer.InsertString(1, shortInsert.Data(), 2); SWTest.Assert(buffer.Length() == lenTest); for (int k = 0; k < lenTest; k++) { SWTest.Assert(test.CharAt(k) == buffer.CharAt(k)); SWTest.Write(k); SWTest.Write(":"); SWTest.Write(buffer.CharAt(k)); SWTest.Write(" "); } SWTest.Write("\n"); double st = SWTest.Now(); Literal longtest = new Literal("ghijklmnopqrstuvwxyz"); for (int l = 0; l < 10000; l++) { for (int m = 0; m < 20; m++) { buffer.InsertString(1, longtest.Data(), m + 1); } } SplitText pbuffer = new SplitText(); pbuffer.AttachStyles(SplitText.CreateStyles(1), null, 0); //pbuffer.DiscardLines(); SWTest.Assert(pbuffer.Length() == 0); //SWTest.Assert(pbuffer.Lines() == 1); pbuffer.InsertString(0, test.Data(), lenTest); SWTest.Assert(pbuffer.Length() == lenTest); for (int n = 0; n < lenTest; n++) { SWTest.Assert(test.CharAt(n) == pbuffer.CharAt(n)); SWTest.Write(n); SWTest.Write(":"); SWTest.Write(pbuffer.CharAt(n)); SWTest.Write(" "); } SWTest.Write("\n"); double t2 = SWTest.Now(); SWTest.Write(t2 - st); SWTest.Write(" seconds for Insertion test\n"); SplitText sbuffer = new SplitText(); IStyles sstyles = SplitText.CreateStyles(1); sbuffer.AttachStyles(sstyles, null, 0); //sbuffer.DiscardLines(); Literal prog = new Literal("//// A demonstration program\r\nint main() {\r\n\tprintf(\"hello world %d\\n\", 9);\r\n}\r\n"); int lenProg = prog.Length(); sbuffer.InsertString(0, prog.Data(), lenProg); //SWTest.Assert(sbuffer.Lines() == 5); Styler sa = new Styler(sbuffer, sstyles, 0, sbuffer.Length()); LexCPP lx = new LexCPP(); WordList wlCPP = new WordList(false); Literal keywordsCPP = new Literal( "abstract as base bool break byte case catch char " + "checked class const continue decimal default " + "delegate do double else enum event explicit " + "extern false finally fixed float for foreach goto " + "if implicit in int interface internal is lock long " + "namespace new null object operator out override " + "params private protected public readonly ref " + "return sbyte sealed short sizeof stackalloc " + "static string struct switch this throw true try " + "typeof uint ulong unchecked unsafe ushort " + "using virtual void while"); lx.SetKeyWords(0, keywordsCPP); lx.Colourise(sa); //DisplayHTML(sbuffer); // Start buffer as big as needed to avoid measuring allocation and copying SplitText bigbuffer = new SplitText(300000, 1024); IStyles bigstyles = SplitText.CreateStyles(1); bigbuffer.AttachStyles(bigstyles, null, 0); MarkerSet ms2 = new MarkerSet(); bigbuffer.AddPerLineData(ms2); //bigbuffer.DiscardLines(); // prog is about 80 characters so create a realistic large 120K document for (int q = 0; q < 3000; q++) { bigbuffer.InsertString(lenProg * (q / 2), prog.Data(), lenProg); } for (int q2 = 0; q2 < 1500; q2++) { bigbuffer.DeleteRange(lenProg * (q2 / 2), lenProg); } SWTest.Assert(bigbuffer.Length() == 1500 * lenProg); SWTest.Assert(bigbuffer.Lines() == 1500 * 4 + 1); double t3 = SWTest.Now(); SWTest.Write(t3 - t2); SWTest.Write(" seconds for Lines Insertion Deletion test\n"); // Run 50 times to get a large enough time to measure Colourise operation for (int p = 0; p < 50; p++) { Styler sabig = new Styler(bigbuffer, bigstyles, 0, bigbuffer.Length()); lx.Colourise(sabig); } double t31 = SWTest.Now(); SWTest.Write((t31 - t3) / 50.0); SWTest.Write(" seconds for Colourise test\n"); int biglength = bigbuffer.Length(); // Search for "printf" Literal printfs = new Literal("printf"); int lenPrintfs = printfs.Length(); for (int r = 0; r < 50; r++) { int count = 0; for (int s = 0; s < biglength; s++) { if (bigbuffer.CharAt(s) == printfs.CharAt(0)) { int found = 1; for (int t = 1; t < lenPrintfs && found == 1; t++) { if (bigbuffer.CharAt(s + t) != printfs.CharAt(t)) { found = 0; } } if (found == 1) { count++; } } } SWTest.Assert(count == 1500); } double t4 = SWTest.Now(); SWTest.Write((t4 - t31) / 50.0); SWTest.Write(" seconds for Search test\n"); // Search for "printf" and replace with "OutputTrace" // Then reverse the process so it can be done again Literal replace = new Literal("OutputTrace"); int lenReplace = replace.Length(); for (int u = 0; u < 50; u++) { int count = 0; for (int s = 0; s < biglength; s++) { if (bigbuffer.CharAt(s) == printfs.CharAt(0)) { int found = 1; for (int t = 1; t < lenPrintfs && found == 1; t++) { if (bigbuffer.CharAt(s + t) != printfs.CharAt(t)) { found = 0; } } if (found == 1) { count++; bigbuffer.DeleteRange(s, lenPrintfs); bigbuffer.InsertString(s, replace.Data(), lenReplace); biglength += lenReplace - lenPrintfs; } } } SWTest.Assert(count == 1500); count = 0; for (int s = 0; s < biglength; s++) { if (bigbuffer.CharAt(s) == replace.CharAt(0)) { int found = 1; for (int t = 1; t < lenReplace && found == 1; t++) { if (bigbuffer.CharAt(s + t) != replace.CharAt(t)) { found = 0; } } if (found == 1) { count++; bigbuffer.DeleteRange(s, lenReplace); bigbuffer.InsertString(s, printfs.Data(), lenPrintfs); biglength += lenPrintfs - lenReplace; } } } SWTest.Assert(count == 1500); } double en = SWTest.Now(); SWTest.Write((en - t4) / 100.0); SWTest.Write(" seconds for Replace test\n"); }
public override string ToString() { return(UsingItem.AsFullString(50) + " --" + MarkerSet.AsFullString(50) + "-> " + UsedItem.AsFullString(50)); }
public bool IsMarkerMatch(params string[] patterns) { return(MarkerSet.IsMatch(patterns.Select(p => MarkerMatch.CreateEval(p, false)))); }
public bool IsMarkerMatch(IEnumerable <CountPattern <IMatcher> .Eval> evals) { return(MarkerSet.IsMatch(evals)); }
private void UpdateMarker(MarkerSet markerSet, double latitude, double longitude) { UpdateFileLocations(markerSet.Files, latitude, longitude); }
private MarkerSet CreateMarkerSet(IList<string> pathList) { // Ensure files aren't in multiple marker sets - that's confusing. HashSet<MarkerSet> removeSet = new HashSet<MarkerSet>(); foreach (var ms in allMarkers.Values) { foreach (var path in pathList) { if (ms.Files.Contains(path)) { removeSet.Add(ms); break; } } } foreach (var ms in removeSet) { MapWebView.InvokeMapScript("removeMarker({0})", ms.Id); } var markerSet = new MarkerSet { Files = pathList }; allMarkers.Add(markerSet.Id, markerSet); return markerSet; }
unsafe void WarpingAlgorithm.WarpImage(MarkerSet markerSet, Morphing.ImageData inputImage, Morphing.ImageData outputImage, bool startImage) { System.Diagnostics.Debug.Assert(markerSet != null && inputImage != null && outputImage != null); TriangleMarkerSet triangleMarkerSet = markerSet as TriangleMarkerSet; System.Diagnostics.Debug.Assert(triangleMarkerSet != null); if (triangleMarkerSet.Triangles.Count() == 0) return; // prepare data // dest DestTriangle[] destTriangles = triangleMarkerSet.Triangles.Select(x => new DestTriangle() { A = x.Vertices[0].InterpolatedMarker, V0 = x.Vertices[2].InterpolatedMarker - x.Vertices[0].InterpolatedMarker, V1 = x.Vertices[1].InterpolatedMarker - x.Vertices[0].InterpolatedMarker }).ToArray(); for (int i = 0; i < destTriangles.Length; ++i ) { destTriangles[i].V0DotV0_divDenom = destTriangles[i].V0.LengthSquared; destTriangles[i].V1DotV1_divDenom = destTriangles[i].V1.LengthSquared; destTriangles[i].V0DotV1_divDenom = destTriangles[i].V0.Dot(destTriangles[i].V1); double invDenom = 1.0 / (destTriangles[i].V0DotV0_divDenom * destTriangles[i].V1DotV1_divDenom - destTriangles[i].V0DotV1_divDenom * destTriangles[i].V0DotV1_divDenom); destTriangles[i].V0DotV0_divDenom *= invDenom; destTriangles[i].V1DotV1_divDenom *= invDenom; destTriangles[i].V0DotV1_divDenom *= invDenom; } // src SourceTriangle[] sourceTriangles; if (startImage) { sourceTriangles = triangleMarkerSet.Triangles.Select(x => new SourceTriangle() { A = x.Vertices[0].StartMarker, V0 = x.Vertices[2].StartMarker - x.Vertices[0].StartMarker, V1 = x.Vertices[1].StartMarker - x.Vertices[0].StartMarker }).ToArray(); } else { sourceTriangles = triangleMarkerSet.Triangles.Select(x => new SourceTriangle() { A = x.Vertices[0].EndMarker, V0 = x.Vertices[2].EndMarker - x.Vertices[0].EndMarker, V1 = x.Vertices[1].EndMarker - x.Vertices[0].EndMarker }).ToArray(); } // process pixel wise double xStep = 1.0 / outputImage.Width; Parallel.For(0, outputImage.Height, yi => { Color* outputDataPixel = outputImage.Data + yi * outputImage.Width; Color* lastOutputDataPixel = outputDataPixel + outputImage.Width; double y = (double)yi / outputImage.Height; double u,v; double dot02, dot12; Vector v2; for (double x = 0; outputDataPixel != lastOutputDataPixel; x += xStep, ++outputDataPixel) { Vector position = new Vector(x, y); for (int triangleIdx = 0; triangleIdx < destTriangles.Length; ++triangleIdx) { // compute barycentric - http://www.blackpawn.com/texts/pointinpoly/ v2 = position - destTriangles[triangleIdx].A; // Compute dot products dot02 = VectorExtension.Dot(destTriangles[triangleIdx].V0, v2); dot12 = VectorExtension.Dot(destTriangles[triangleIdx].V1, v2); // Compute barycentric coordinates u = (destTriangles[triangleIdx].V1DotV1_divDenom * dot02 - destTriangles[triangleIdx].V0DotV1_divDenom * dot12); v = (destTriangles[triangleIdx].V0DotV0_divDenom * dot12 - destTriangles[triangleIdx].V0DotV1_divDenom * dot02); // Check if point is in triangle if ((u >= 0) && (v >= 0) && (u + v < 1)) { position = sourceTriangles[triangleIdx].A + sourceTriangles[triangleIdx].V0 * u + sourceTriangles[triangleIdx].V1 * v; break; } } position = position.ClampToImageArea(); *outputDataPixel = inputImage.Sample(position.X, position.Y); } }); }
private void UpdateMarkerCanvases(MarkerSet.Location location) { if (_morphingAlgorithm.MarkerSet != null) { switch(location) { case MarkerSet.Location.END_IMAGE: case MarkerSet.Location.START_IMAGE: _morphingAlgorithm.MarkerSet.UpdateMarkerCanvas(MarkerSet.Location.START_IMAGE, StartImageMarkerCanvas, new Vector((StartImageMarkerCanvas.ActualWidth - StartImage.ActualWidth) / 2, (StartImageMarkerCanvas.ActualHeight - StartImage.ActualHeight) / 2), new Vector(StartImage.ActualWidth, StartImage.ActualHeight)); _morphingAlgorithm.MarkerSet.UpdateMarkerCanvas(MarkerSet.Location.END_IMAGE, EndImageMarkerCanvas, new Vector((EndImageMarkerCanvas.ActualWidth - EndImage.ActualWidth) / 2, (EndImageMarkerCanvas.ActualHeight - EndImage.ActualHeight) / 2), new Vector(EndImage.ActualWidth, EndImage.ActualHeight)); break; case MarkerSet.Location.OUTPUT_IMAGE: _morphingAlgorithm.MarkerSet.UpdateMarkerCanvas(MarkerSet.Location.OUTPUT_IMAGE, OutputImageMarkerCanvas, new Vector((OutputImageMarkerCanvas.ActualWidth - OutputImage.ActualWidth) / 2, (OutputImageMarkerCanvas.ActualHeight - OutputImage.ActualHeight) / 2), new Vector(OutputImage.ActualWidth, OutputImage.ActualHeight)); break; } } }