1
$\begingroup$

I don't know how my code is exceeding the recursion limit of 1024.

subdivide[verts_, n_] := (
  
  listOfPoints = Join[verts, {verts[[1]]}];
  
subdivisons = {}; 
    
For[i = 1, i < Length[listOfPoints], i++,
firstPoint = listOfPoints[[i]]; 
secondPoint = listOfPoints[[i + 1]];
x = (secondPoint[[1]] - firstPoint[[1]])/n;
y = (secondPoint[[2]] - firstPoint[[2]])/n;

For[j = 0, j < n, j++, 
 subdivisions = Join[subdivisions, {firstPoint + j {x, y}}];

];];



subdivisions;
)

Can someone please advise?

$\endgroup$
6
  • $\begingroup$ If you scrape-n-paste that into a notebook then I think you have a missing ] somewhere to finish off your first For $\endgroup$
    – Bill
    Dec 2, 2023 at 4:29
  • $\begingroup$ Whoops, sorry. There was a ] there already, I didn't realize I didn't put it. $\endgroup$ Dec 2, 2023 at 5:43
  • $\begingroup$ Wonderful. Next, do you expect your subdivide to return the value in subdivisions? If so then do you want that ; at the end of that? Next, you might include one more line of code at the end, maybe something like subdivide[{1,2,5},4] or whatever would be good example input to your function. Next, you might try restarting MMA and running your code again. MMA has a cache and keeps track of previous assignments. Sometimes recursion errors are the result of a variable or function still being in cache. At the moment I'm getting an odd error about missing ) that I haven't figured out. $\endgroup$
    – Bill
    Dec 2, 2023 at 6:14
  • $\begingroup$ subdivide is meant to return an evenly divided n-1 number of points in between the vertices provided, which are meant to be the vertices of a polygon. So, if it's given {0, 0}, {1, 0}, {1, 1}, {0, 1} with n = 2, it'll give the halfway points between the vertices and end up with 8 coordinates. $\endgroup$ Dec 2, 2023 at 6:54
  • $\begingroup$ Two typos. First, subdivisons = {}; has a typo. Second, remove the semicolon after the final subdivisions; $\endgroup$
    – LouisB
    Dec 2, 2023 at 8:18

1 Answer 1

1
$\begingroup$

I suggest that we use Mathematica's list manipulation capabilities to eliminate the For loops. Here's a subdivide function:

subdivide[verts_List, n_] := Flatten[Most[
  Transpose[
    Subdivide[Sequence @@ #, n] &/@ #]] &/@
  Transpose/@Partition[Append[verts, First@verts], 2, 1], 1]

Example: each side of a square divided into two parts

verts = CirclePoints[Sqrt[2], 4];
n = 2;
subdivisions = subdivide[verts, n];
Graphics[{EdgeForm[Black], FaceForm[None], Polygon[verts],
  Red, PointSize[Scaled[.025]], Point[subdivisions]}, ImageSize -> 240]

example 1

Example: each side of a random, five-sided polygon divided into four parts

SeedRandom[2];
verts = RandomPolygon[5][[1]];
n = 4;
subdivisions = subdivide[verts, n];
Graphics[{EdgeForm[Black], FaceForm[None], Polygon[verts],
  Red, PointSize[Scaled[.025]], Point[subdivisions]}, ImageSize -> 240]

example 2

Details of the subdivide function

The first step is to start with the vertices' coordinate pairs, {{x1, y1}, ... {xn, yn}}, then rearrange pairs into the x and y pair coordinates for the start and end points of each side. For example:

verts = {{x1, y1}, {x2, y2}, {x3, y3}};
Transpose/@Partition[Append[verts,First@verts], 2, 1]
{{{x1, x2}, {y1, y2}}, {{x2, x3}, {y2, y3}}, {{x3, x1},{y3, y1}}}

Next, use Subdivide to find the n subdivisions of each side, and Transpose back into {x, y} pairs. Because the last point of each line is the first point of the following line, use Most to remove the duplicates. Flatten gives the resulting list of points for subdivisions.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.