/// <summary> /// Calculates an array of points along the curve spaces so that each pair /// of adjacent points are the same distance apart. /// </summary> /// <param name="distPerDivision">The required distance per pair of points /// </param> /// <returns></returns> public PointF[] Points(float distPerDivision) { int numDivisions = Math.Max((int) (Length() / distPerDivision), 2); PointF[] oldPoints = PointsUneven(numDivisions / 2); PointF[] points = new PointF[numDivisions]; points[0] = oldPoints[0]; int lastPassedPointIndex = 0; float distFromLastPassedPoint = 0.0f; float distToLastPassedPoint = 0.0f; for (int ii = 1; ii < numDivisions; ii++) { PointF prevPoint = oldPoints[lastPassedPointIndex]; for (int jj = lastPassedPointIndex + 1; jj < oldPoints.Length; jj++) { PointF nextPoint = oldPoints[jj]; float distBetweenOldPoints = GeometryUtils.DistBetweenPoints(prevPoint, nextPoint); if (distBetweenOldPoints - distFromLastPassedPoint > distPerDivision) { float ratio = (distPerDivision + distFromLastPassedPoint) / distBetweenOldPoints; distFromLastPassedPoint += distPerDivision; points[ii] = GeometryUtils.PointOnLine(prevPoint, nextPoint, ratio); break; } else { distToLastPassedPoint = distBetweenOldPoints - distFromLastPassedPoint; distFromLastPassedPoint = -1 * distToLastPassedPoint; lastPassedPointIndex = jj; prevPoint = oldPoints[lastPassedPointIndex]; } } } return points.ToArray(); }
static Bitmap transformRandom(Bitmap bmp, PointF[] points) { const float maxTranslation = 0; const float maxRotation = 0; const float maxScale = 0.30f; var ps = points.ToArray(); Bitmap result = new Bitmap(origImgSize, origImgSize); using (Graphics g = Graphics.FromImage(result)) { var scl = 1.0f +(float)(Tools.rnd.Uniform() * maxScale); var imh = origImgSize / 2.0f; g.TranslateTransform(-origImgSize / 2.0f, -origImgSize / 2.0f, System.Drawing.Drawing2D.MatrixOrder.Append); g.ScaleTransform(scl, scl, System.Drawing.Drawing2D.MatrixOrder.Append); var rot = ((float)Tools.rnd.Uniform() - 0.5f) * 2 * maxRotation; g.RotateTransform(rot, System.Drawing.Drawing2D.MatrixOrder.Append); g.TranslateTransform(+imh, +imh, System.Drawing.Drawing2D.MatrixOrder.Append); var tx = ((float)Tools.rnd.Uniform() - 0.5f) * 2 * maxTranslation; var ty = ((float)Tools.rnd.Uniform() - 0.5f) * 2 * maxTranslation; //tx = 10; //ty = 20; g.TranslateTransform(tx, ty); g.DrawImage(bmp, 0, 0, result.Width, result.Height); g.Transform.TransformPoints(ps); } for (int i = 0; i < ps.Length; ++i) { if (points[i].X != -1) points[i].X = ps[i].X; if (points[i].Y != -1) points[i].Y = ps[i].Y; } for (int i = 0; i < ps.Length; ++i) { if (points[i].X < 0 || points[i].X > origImgSize || points[i].Y < 0 || points[i].Y > origImgSize) { points[i].X = -1; points[i].Y = -1; } } return result; }
public PointF[] ToWorld(PointF[] captureCameraPoints) { var worldPoints = captureCameraPoints.ToArray(); CameraToWorld.ProjectPoints(worldPoints); return worldPoints; }