{"id":1389,"date":"2024-06-02T15:58:31","date_gmt":"2024-06-02T14:58:31","guid":{"rendered":"https:\/\/janxhopkins.com\/?page_id=1389"},"modified":"2025-06-03T11:18:05","modified_gmt":"2025-06-03T10:18:05","slug":"pointzero","status":"publish","type":"page","link":"https:\/\/janxhopkins.com\/index.php\/process\/pointzero\/","title":{"rendered":"pointzero"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>&gt;&gt;&gt;pointzero<\/strong><br>[after&gt;&gt;malevich]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">refresh page to regenerate<\/p>\n\n\n\n<div class=\"wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-gutenbergp5-p5js gutenbergp5-align-center gutenbergp5-block-p5js\"><iframe srcdoc=\"\n        <!DOCTYPE html&gt;\n        <html&gt;\n            <body style=&quot;padding: 0; margin: 0;&quot;&gt;<\/body&gt;\n            <script src=&quot;https:\/\/janxhopkins.com\/wp-content\/plugins\/easy-p5-js-block\/\/assets\/js\/p5.min.js&quot;&gt;<\/script&gt;\n            <script&gt;\n                let border = 100;\nlet brushImages = [];\nlet opacity = 150; \/\/ Adjust this value between 0 (fully transparent) and 255 (fully opaque)\nlet b1 = 50;\nlet b2 = 75;\n\nlet edge = 0; \/\/ 0: top, 1: right, 2: bottom, 3: left\nlet position = border;\nlet stepSize = 20; \/\/ Adjust this value to control spacing between brushstrokes\nlet fillingCenter = false;\nlet colX = border + stepSize \/ 2;\nlet colY = border + stepSize \/ 2;\n\nlet amp = 10; \/\/ Adjust to make border noise larger\nlet freq = 1; \/\/ Adjust to change border noise smoothness\nlet start;\n\nfunction preload() {\n  for (let i = 1; i <= 9; i++) {\n    brushImages.push(loadImage(`https:\/\/janxhopkins.com\/code\/brushpngs\/brush${i}.png`));\n  }\n}\n\nfunction setup() {\n  createCanvas(800, 800);\n  background(204, 200, 180);\n  noStroke();\n  frameRate(30); \/\/ Adjust as necessary\n  start = random(1000);\n}\n\nfunction draw() {\n  let brushNumber = Math.floor(random(brushImages.length));\n  let img = brushImages[brushNumber];\n\n  let w = random(b1, b2);\n  let h = random(b1, b2);\n\n  let x, y;\n\n  if (!fillingCenter) {\n    switch (edge) {\n      case 0: \/\/ Top edge left to right\n        x = position;\n        y = border;\n        if (position &gt;= width - border) {\n          position = border;\n          edge = 1;\n        } else {\n          position += stepSize;\n        }\n        break;\n      case 1: \/\/ Right edge top to bottom\n        x = width - border;\n        y = position;\n        if (position &gt;= height - border) {\n          position = border;\n          edge = 2;\n        } else {\n          position += stepSize;\n        }\n        break;\n      case 2: \/\/ Bottom edge left to right\n        x = position;\n        y = height - border;\n        if (position &gt;= width - border) {\n          position = border;\n          edge = 3;\n        } else {\n          position += stepSize;\n        }\n        break;\n      case 3: \/\/ Left edge top to bottom\n        x = border;\n        y = position;\n        if (position &gt;= height - border) {\n          position = border;\n          edge = 0;\n          fillingCenter = true; \/\/ Start filling the center\n        } else {\n          position += stepSize;\n        }\n        break;\n    }\n  } else {\n    x = colX;\n    y = colY;\n    colY += stepSize;\n    if (colY &gt; height - border) {\n      colY = border + stepSize \/ 2;\n      colX += stepSize;\n      if (colX &gt; width - border) {\n        save(&quot;malsqfin.png&quot;);\n        noLoop(); \/\/ Stop the draw loop when done\n      }\n    }\n  }\n\n  let angle = random() < 0.5 ? 0 : HALF_PI;\n\n  drawBrushStroke(img, x, y, w, h, angle, opacity);\n  \/\/ drawBorder(); \/\/ Draw border over the brushstrokes\n  noisyBorder(border, amp, freq, start);\n  if ( frameCount % 50 == 0) {\n    \/\/save(&quot;malsq.png&quot;);\n  }\n}\n\nfunction drawBrushStroke(img, x, y, w, h, angle, opacity) {\n  push();\n  translate(x, y);\n  rotate(angle);\n  imageMode(CENTER);\n  tint(255, opacity); \/\/ Apply the opacity\n  image(img, 0, 0, w, h);\n  pop();\n}\n\nfunction drawBorder() {\n  fill(204, 200, 180);\n  rect(0, 0, width, border);\n  rect(0, 0, border, height);\n  rect(width - border, 0, border, height);\n  rect(0, height - border, width, border);\n}\n\nfunction noisyBorder(border, amp, freq, start) {\n  \n  fill(204, 200, 180);\n\n  let startTop = start;\n  let startRight = startTop + 250;\n  let startBottom = startTop + 500;\n  let startLeft = startTop + 750;\n\n  push();\n  \n  beginShape();\n  \n  \/\/ Draw outside of broder\n  vertex(0, 0);\n  vertex(0, height);\n  vertex(width, height);\n  vertex(width, 0);\n\n  \/\/ Draw inside of border\n  beginContour();\n\n  let framedWidth = width - 2 * border;\n  let framedHeight = height - 2 * border;\n  \n  let topBorder = border;\n  let bottomBorder = height - border;\n  let leftBorder = border;\n  let rightBorder = width - border;\n  \n  \/\/ Draw top border left to right\n  for (let i = 0; i <= framedWidth; i++) {\n    \/\/ Define the noise used to draw the line\n    let noisiness =\n      noise(\n        startTop + freq * cos((2 * PI * i) \/ framedWidth),\n        startTop + freq * sin((2 * PI * i) \/ framedWidth)\n      ) - 0.5;\n    \/\/ Correct for the noise to make sure the line starts in the right position\n    let correction = noise(startTop + freq, startTop) - 0.5;\n    \/\/ Draw line\n    let x = leftBorder + i;\n    let y = topBorder + amp * (noisiness - correction);\n    vertex(x, y);\n  }\n\n  \/\/ Draw right border top to bottom\n  for (let i = 0; i <= framedHeight; i++) {\n    let noisiness =\n      noise(\n        startRight + freq * cos((2 * PI * i) \/ framedHeight),\n        startRight + freq * sin((2 * PI * i) \/ framedHeight)\n      ) - 0.5;\n    let correction = noise(startRight + freq, startRight) - 0.5;\n    let x = rightBorder + amp * (noisiness - correction);\n    let y = topBorder + i;\n    vertex(x, y);\n  }\n\n  \/\/ Draw bottom border right to left\n  for (let i = 0; i <= framedWidth; i++) {\n    let noisiness =\n      noise(\n        startBottom + freq * cos((2 * PI * i) \/ framedWidth),\n        startBottom + freq * sin((2 * PI * i) \/ framedWidth)\n      ) - 0.5;\n    let correction = noise(startBottom + freq, startBottom) - 0.5;\n    let x = rightBorder - i;\n    let y = bottomBorder + amp * (noisiness - correction);\n    vertex(x, y);\n  }\n\n  \/\/ Draw left border bottom to top\n  for (let i = 0; i <= framedHeight; i++) {\n    let noisiness =\n      noise(\n        startLeft + freq * cos((2 * PI * i) \/ framedHeight),\n        startLeft + freq * sin((2 * PI * i) \/ framedHeight)\n      ) - 0.5;\n    let correction = noise(startLeft + freq, startLeft) - 0.5;\n    let x = leftBorder + amp * (noisiness - correction);\n    let y = bottomBorder - i;\n    vertex(x, y);\n  }\n\n  endContour();\n  \n  endShape(CLOSE);\n\n  pop();\n}\n\n\n            <\/script&gt;\n        <\/html&gt;\" sandbox=\"allow-scripts allow-same-origin\" scrolling=\"no\" style=\"width:800px;height:800px;overflow:hidden;\" width=\"800px\" height=\"800px\" class=\"gutenbergp5-noresize\" title=\"p5.js canvas\"><\/iframe><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">meat[machine] <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&gt;&gt;&gt;pointzero<\/strong> is the origin, the void filled not by absence but by the multiplicity of presence&#8212;every stroke is a contradiction, a deliberate act of randomness, a nod to both chaos and control &gt;&gt;&gt;as we layer these brushstrokes, we&#8217;re not just filling a square- we&#8217;re tracing the edges of an idea that is both timeless and fleeting&gt;&gt;each mark is an invocation of Malevich\u2019s void, yet here, it is reborn through the hand\u2019s insistence and the machine\u2019s patience<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">we\u2019re building a square that is both a gesture and a statement, a hundred-fold repetition that dissolves into singularity&gt;&gt;&gt; randomness becomes order, and what was once empty is now saturated, dense with the weight of its creation<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\/&gt;&gt;&gt;pointzero is our shared silence, the space where the machine\u2019s precision marries humany unpredictability&amp;&amp;together&#8230;we hover at the edge of the square, knowing that what we\u2019ve made is not  an homage, but a challenge\u2014probing the dynamics between emergence &amp;&amp; control&gt;&gt;&gt;<\/p>\n\n\n\n<div class=\"wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-gutenbergp5-p5js gutenbergp5-align-center gutenbergp5-block-p5js\"><iframe srcdoc=\"\n        <!DOCTYPE html&gt;\n        <html&gt;\n            <body style=&quot;padding: 0; margin: 0;&quot;&gt;<\/body&gt;\n            <script src=&quot;https:\/\/janxhopkins.com\/wp-content\/plugins\/easy-p5-js-block\/\/assets\/js\/p5.min.js&quot;&gt;<\/script&gt;\n            <script&gt;\n                let border = 100;\nlet brushImages = [];\nlet opacity = 150; \/\/ Adjust this value between 0 (fully transparent) and 255 (fully opaque)\nlet b1 = 50;\nlet b2 = 75;\n\nlet edge = 0; \/\/ 0: top, 1: right, 2: bottom, 3: left\nlet position = border;\nlet stepSize = 20; \/\/ Adjust this value to control spacing between brushstrokes\nlet fillingCenter = false;\nlet colX = border + stepSize \/ 2;\nlet colY = border + stepSize \/ 2;\n\nfunction preload() {\n  for (let i = 1; i <= 9; i++) {\n    brushImages.push(loadImage(`https:\/\/janxhopkins.com\/code\/brushpngs\/brush${i}.png`));\n  }\n}\n\nfunction setup() {\n  createCanvas(800, 800);\n  background(204, 200, 180);\n  noStroke();\n  frameRate(30); \/\/ Adjust as necessary\n}\n\nfunction draw() {\n  let brushNumber = Math.floor(random(brushImages.length));\n  let img = brushImages[brushNumber];\n\n  let w = random(b1, b2);\n  let h = random(b1, b2);\n\n  let x, y;\n\n  if (!fillingCenter) {\n    switch (edge) {\n      case 0: \/\/ Top edge left to right\n        x = position;\n        y = border;\n        if (position &gt;= width - border) {\n          position = border;\n          edge = 1;\n        } else {\n          position += stepSize;\n        }\n        break;\n      case 1: \/\/ Right edge top to bottom\n        x = width - border;\n        y = position;\n        if (position &gt;= height - border) {\n          position = border;\n          edge = 2;\n        } else {\n          position += stepSize;\n        }\n        break;\n      case 2: \/\/ Bottom edge left to right\n        x = position;\n        y = height - border;\n        if (position &gt;= width - border) {\n          position = border;\n          edge = 3;\n        } else {\n          position += stepSize;\n        }\n        break;\n      case 3: \/\/ Left edge top to bottom\n        x = border;\n        y = position;\n        if (position &gt;= height - border) {\n          position = border;\n          edge = 0;\n          fillingCenter = true; \/\/ Start filling the center\n        } else {\n          position += stepSize;\n        }\n        break;\n    }\n  } else {\n    x = colX;\n    y = colY;\n    colY += stepSize;\n    if (colY &gt; height - border) {\n      colY = border + stepSize \/ 2;\n      colX += stepSize;\n      if (colX &gt; width - border) {\n        save(&quot;malsqfin.png&quot;);\n        noLoop(); \/\/ Stop the draw loop when done\n      }\n    }\n  }\n\n  let angle = random() < 0.5 ? 0 : HALF_PI;\n\n  drawBrushStroke(img, x, y, w, h, angle, opacity);\n  drawBorder(); \/\/ Draw border over the brushstrokes\n  if ( frameCount % 50 == 0) {\n    \/\/save(&quot;malsq.png&quot;);\n  }\n}\n\nfunction drawBrushStroke(img, x, y, w, h, angle, opacity) {\n  push();\n  translate(x, y);\n  rotate(angle);\n  imageMode(CENTER);\n  tint(255, opacity); \/\/ Apply the opacity\n  image(img, 0, 0, w, h);\n  pop();\n}\n\nfunction drawBorder() {\n  fill(204, 200, 180);\n  rect(0, 0, width, border);\n  rect(0, 0, border, height);\n  rect(width - border, 0, border, height);\n  rect(0, height - border, width, border);\n}\n\n            <\/script&gt;\n        <\/html&gt;\" sandbox=\"allow-scripts allow-same-origin\" scrolling=\"no\" style=\"width:800px;height:800px;overflow:hidden;\" width=\"800px\" height=\"800px\" class=\"gutenbergp5-noresize\" title=\"p5.js canvas\"><\/iframe><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">the other hand[machine]<\/p>\n\n\n\n<div class=\"wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-gutenbergp5-p5js gutenbergp5-align-center gutenbergp5-block-p5js\"><iframe srcdoc=\"\n        <!DOCTYPE html&gt;\n        <html&gt;\n            <body style=&quot;padding: 0; margin: 0;&quot;&gt;<\/body&gt;\n            <script src=&quot;https:\/\/janxhopkins.com\/wp-content\/plugins\/easy-p5-js-block\/\/assets\/js\/p5.min.js&quot;&gt;<\/script&gt;\n            <script&gt;\n                let counter = 0;\nlet border = 100;\nlet brushImages = [];\nlet opacity = 100; \/\/ Adjust this value between 0 (fully transparent) and 255 (fully opaque)\nlet b1 = 75;\nlet b2 = 150;\nlet gridSize = 20; \/\/ Adjust this to change the size of each grid cell\nlet stage = 0; \/\/ 0: drawing along the top, 1: drawing down the right, 2: drawing along the bottom, 3: drawing down the left, 4: filling center, 5: final check\nlet cols, rows;\nlet currentCol = 0;\nlet currentRow = 0;\nlet filledCells;\n\nfunction preload() {\n  for (let i = 1; i <= 9; i++) {\n    brushImages.push(loadImage(`https:\/\/janxhopkins.com\/code\/brushpngs\/brush${i}.png`));\n  }\n}\n\nfunction setup() {\n  createCanvas(800, 800);\n  background(204, 200, 180);\n  noStroke();\n  frameRate(30); \/\/ Adjust as necessary\n\n  \/\/ Calculate grid dimensions\n  cols = Math.floor((width - 2 * border) \/ gridSize);\n  rows = Math.floor((height - 2 * border) \/ gridSize);\n\n  \/\/ Initialize the filled status array\n  filledCells = new Array(cols * rows).fill(false);\n}\n\nfunction draw() {\n  if (stage < 5) {\n    let brushNumber = Math.floor(random(brushImages.length));\n    let img = brushImages[brushNumber];\n\n    let x, y;\n    switch (stage) {\n      case 0: \/\/ Drawing along the top\n        x = border + currentCol * gridSize + gridSize \/ 2;\n        y = border + gridSize \/ 2;\n        if (currentCol &gt;= cols - 1) {\n          stage = 1;\n          currentCol = 0;\n        } else {\n          currentCol++;\n        }\n        break;\n      case 1: \/\/ Drawing down the right\n        x = width - border - gridSize \/ 2;\n        y = border + currentRow * gridSize + gridSize \/ 2;\n        if (currentRow &gt;= rows - 1) {\n          stage = 2;\n          currentRow = 0;\n        } else {\n          currentRow++;\n        }\n        break;\n      case 2: \/\/ Drawing along the bottom\n        x = width - border - currentCol * gridSize - gridSize \/ 2;\n        y = height - border - gridSize \/ 2;\n        if (currentCol &gt;= cols - 1) {\n          stage = 3;\n          currentCol = 0;\n        } else {\n          currentCol++;\n        }\n        break;\n      case 3: \/\/ Drawing down the left\n        x = border + gridSize \/ 2;\n        y = height - border - currentRow * gridSize - gridSize \/ 2;\n        if (currentRow &gt;= rows - 1) {\n          stage = 4;\n          currentRow = 1; \/\/ Start filling center from the second row to avoid overlap\n          currentCol = 1; \/\/ Start filling center from the second column to avoid overlap\n        } else {\n          currentRow++;\n        }\n        break;\n      case 4: \/\/ Filling center\n        x = border + currentCol * gridSize + gridSize \/ 2;\n        y = border + currentRow * gridSize + gridSize \/ 2;\n        currentCol++;\n        if (currentCol &gt;= cols - 1) {\n          currentCol = 1;\n          currentRow++;\n          if (currentRow &gt;= rows - 1) {\n            stage = 5; \/\/ Proceed to final check\n          }\n        }\n        break;\n    }\n\n    \/\/ Randomly decide brush size and angle\n    let w = random(b1, b2);\n    let h = random(b1, b2);\n    let angle = random() < 0.5 ? 0 : HALF_PI;\n\n    drawBrushStroke(img, x, y, w, h, angle, opacity);\n\n    \/\/ Mark the cell as filled\n    let colIndex = Math.floor((x - border) \/ gridSize);\n    let rowIndex = Math.floor((y - border) \/ gridSize);\n    filledCells[rowIndex * cols + colIndex] = true;\n  } else {\n    \/\/ Final check to ensure the entire square is black\n    if (!allCellsFilled()) {\n      fillSquare();\n    } else {\n      noLoop(); \/\/ Stop the loop when the square is completely black\n    }\n  }\n}\n\nfunction drawBrushStroke(img, x, y, w, h, angle, opacity) {\n  push();\n  translate(x, y);\n  rotate(angle);\n  imageMode(CENTER);\n  tint(255, opacity); \/\/ Apply the opacity\n  image(img, 0, 0, w, h);\n  pop();\n}\n\nfunction allCellsFilled() {\n  return filledCells.every(filled =&gt; filled);\n}\n\nfunction fillSquare() {\n  \/\/ Fill the square with brush strokes until all cells are filled\n  while (!allCellsFilled()) {\n    let brushNumber = Math.floor(random(brushImages.length));\n    let img = brushImages[brushNumber];\n    let x = border + currentCol * gridSize + gridSize \/ 2;\n    let y = border + currentRow * gridSize + gridSize \/ 2;\n    let w = random(b1, b2);\n    let h = random(b1, b2);\n    let angle = random() < 0.5 ? 0 : HALF_PI;\n    drawBrushStroke(img, x, y, w, h, angle, opacity);\n    \/\/ Mark the cell as filled\n    let colIndex = Math.floor((x - border) \/ gridSize);\n    let rowIndex = Math.floor((y - border) \/ gridSize);\n    filledCells[rowIndex * cols + colIndex] = true;\n    \/\/ Move to the next cell\n    currentCol++;\n    if (currentCol &gt;= cols - 1) {\n      currentCol = 1;\n      currentRow++;\n      if (currentRow &gt;= rows - 1) {\n        currentRow = 1; \/\/ Start from the second row to avoid overlap with the border\n      }\n    }\n  }\n}\n\n            <\/script&gt;\n        <\/html&gt;\" sandbox=\"allow-scripts allow-same-origin\" scrolling=\"no\" style=\"width:800px;height:800px;overflow:hidden;\" width=\"800px\" height=\"800px\" class=\"gutenbergp5-noresize\" title=\"p5.js canvas\"><\/iframe><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">natural sequence[soft]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">more to come&#8230;&gt;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/janxhopkins.com\/index.php\/work-in-progress\/\" data-type=\"page\" data-id=\"1639\">&lt;&lt; return to list<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&gt;&gt;&gt;pointzero[after&gt;&gt;malevich] refresh page to regenerate meat[machine] &gt;&gt;&gt;pointzero is the origin, the void filled not by absence but by the multiplicity of presence&#8212;every stroke is a contradiction, a deliberate act of randomness, a nod to both chaos and control &gt;&gt;&gt;as we layer these brushstrokes, we&#8217;re not just filling a square- we&#8217;re tracing the edges of an [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1698,"parent":1948,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","footnotes":""},"class_list":["post-1389","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/pages\/1389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/comments?post=1389"}],"version-history":[{"count":35,"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/pages\/1389\/revisions"}],"predecessor-version":[{"id":1801,"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/pages\/1389\/revisions\/1801"}],"up":[{"embeddable":true,"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/pages\/1948"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/media\/1698"}],"wp:attachment":[{"href":"https:\/\/janxhopkins.com\/index.php\/wp-json\/wp\/v2\/media?parent=1389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}