{"id":3698,"date":"2025-06-22T14:22:01","date_gmt":"2025-06-22T14:22:01","guid":{"rendered":"https:\/\/asta-hsh.de\/?page_id=3698"},"modified":"2025-06-22T14:44:11","modified_gmt":"2025-06-22T14:44:11","slug":"grafik-primitive","status":"publish","type":"page","link":"https:\/\/asta-hsh.de\/en\/grafik-primitive\/","title":{"rendered":"Grafik-Primitive"},"content":{"rendered":"<div><!-- Triangle Strip \/ Fan Builder f\u00fcr WordPress --><\/p>\n<div id=\"triangle-builder-container\" style=\"max-width:760px; margin:auto;\">\n<style>\n    \/* Scoped Styles *\/\n    #triangle-builder-container * { box-sizing:border-box; }\n    #triangle-builder-controls {\n      display:flex; align-items:center; gap:12px;\n      padding:12px 16px; background:#121214; border-radius:8px;\n      margin-bottom:12px;\n    }\n    #triangle-builder-controls input[type=\"radio\"] { display:none; }\n    \/* span als Block, nimmt ganze Label-Fl\u00e4che ein *\/\n    #triangle-builder-controls label span {\n      display: block;\n      width: 100%;\n      padding: 8px 16px;\n      border-radius: 4px;\n      background: #2c2f36;\n      color: #e0e0e0;\n      text-align: center;\n      transition: background .2s, color .2s;\n    }\n    #triangle-builder-controls label span:hover {\n      background: #3a3f47;\n    }\n    \/* angew\u00e4hltes span f\u00e4rben *\/\n    #triangle-builder-controls input[type=\"radio\"]:checked + span {\n      background: #61dafb;\n      color: #20232a;\n    }\n    #triangle-builder-clear {\n      margin-left:auto; padding:8px 16px;\n      background:#007acc; color:#fff; border:none; border-radius:4px;\n      cursor:pointer; transition:background .2s;\n    }\n    #triangle-builder-clear:hover { background:#005fa3; }<\/p>\n<p>    .triangle-builder-canvas-wrap {\n      background:#20232a; border-radius:8px; overflow:hidden;\n      box-shadow:inset 0 0 6px rgba(0,0,0,0.4);\n    }\n    #triangle-builder-canvas { display:block; cursor:crosshair; }<\/p>\n<p>    #triangle-builder-status {\n      margin-top:6px; font-size:.85rem; display:flex;\n      justify-content:space-between; color:#bbb;\n    }<\/p>\n<p>    #triangle-builder-output {\n      width:100%; height:30vh; margin-top:12px; padding:8px;\n      font-family:monospace; font-size:.9rem; background:#282c34;\n      color:#abb2bf; border:none; border-radius:4px; resize:none;\n      box-shadow:inset 0 0 4px rgba(0,0,0,0.5);\n    }\n  <\/style>\n<div id=\"triangle-builder-controls\">\n    <label title=\"Modus Triangle Strip\"><br \/>\n      <input type=\"radio\" name=\"tb-mode\" value=\"strip\" checked><br \/>\n      <span>Triangle Strip<\/span><br \/>\n    <\/label><br \/>\n    <label title=\"Modus Triangle Fan\"><br \/>\n      <input type=\"radio\" name=\"tb-mode\" value=\"fan\"><br \/>\n      <span>Triangle Fan<\/span><br \/>\n    <\/label><br \/>\n    <button id=\"triangle-builder-clear\">Clear<\/button>\n  <\/div>\n<div class=\"triangle-builder-canvas-wrap\">\n    <canvas id=\"triangle-builder-canvas\" width=\"700\" height=\"400\"><\/canvas>\n  <\/div>\n<div id=\"triangle-builder-status\">\n<div id=\"triangle-builder-coords\">Maus: \u2013<\/div>\n<div>Backspace: L\u00f6schen<\/div>\n<\/p><\/div>\n<p>  <textarea id=\"triangle-builder-output\" readonly><\/textarea><\/p>\n<p>  <script>\n  (function(){\n    const canvas = document.getElementById('triangle-builder-canvas'),\n          ctx    = canvas.getContext('2d'),\n          output = document.getElementById('triangle-builder-output'),\n          clearB = document.getElementById('triangle-builder-clear'),\n          modes  = document.getElementsByName('tb-mode'),\n          coords = document.getElementById('triangle-builder-coords');<\/p>\n<p>    const R=6, HP=3, GS=50;\n    let verts=[], history=[[]], hi=0, drag=null, sel=null;<\/p>\n<p>    function recHistory(){\n      history = history.slice(0,hi+1);\n      history.push(JSON.parse(JSON.stringify(verts)));\n      hi++;\n    }\n    function undo(){\n      if(hi>0){ hi--; verts=JSON.parse(JSON.stringify(history[hi])); sel=null; redraw(); }\n    }\n    function redo(){\n      if(hi+1<history.length){ hi++; verts=JSON.parse(JSON.stringify(history[hi])); sel=null; redraw(); }\n    }\n    function getMode(){\n      return document.querySelector('input[name=\"tb-mode\"]:checked').value;\n    }\n    function clearAll(){\n      verts=[]; history=[[]]; hi=0; sel=null; redraw();\n    }\n    function addV(x,y){\n      verts.push({x,y}); recHistory(); sel=verts.length-1; redraw();\n    }\n    function drawGrid(){\n      ctx.strokeStyle='#2c2f36'; ctx.lineWidth=1;\n      for(let x=GS;x<canvas.width;x+=GS){ ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,canvas.height);ctx.stroke();}\n      for(let y=GS;y<canvas.height;y+=GS){ ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(canvas.width,y);ctx.stroke();}\n    }\n    function drawTri(a,b,c){\n      ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.lineTo(b.x,b.y);ctx.lineTo(c.x,c.y);ctx.closePath();ctx.stroke();\n    }\n    function redraw(){\n      ctx.clearRect(0,0,canvas.width,canvas.height);\n      drawGrid();\n      const mode=getMode();\n      if(verts.length>=3){\n        ctx.strokeStyle='#61dafb';ctx.lineWidth=2;\n        if(mode==='strip'){\n          for(let i=2;i<verts.length;i++) drawTri(verts[i-2],verts[i-1],verts[i]);\n        } else {\n          const c=verts[0]; for(let i=2;i<verts.length;i++) drawTri(c,verts[i-1],verts[i]);\n        }\n      }\n      ctx.font='12px sans-serif'; ctx.textAlign='left'; ctx.textBaseline='bottom';\n      verts.forEach((v,i)=>{\n        ctx.fillStyle='#fff';ctx.beginPath();ctx.arc(v.x,v.y,R,0,2*Math.PI);ctx.fill();\n        ctx.fillText(`V${i+1}`,v.x+R+4,v.y-R-4);\n      });\n      if(sel!==null&&verts[sel]){\n        const v=verts[sel]; ctx.strokeStyle='#ffd54f';ctx.lineWidth=2;\n        ctx.beginPath();ctx.arc(v.x,v.y,R+HP,0,2*Math.PI);ctx.stroke();\n      } else if(verts.length){\n        const v=verts[verts.length-1]; ctx.strokeStyle='#ff6b6b';ctx.lineWidth=2;\n        ctx.beginPath();ctx.arc(v.x,v.y,R+HP,0,2*Math.PI);ctx.stroke();\n      }\n      const elems=verts.map((_,i)=>i), tris=[];\n      if(verts.length>=3){\n        if(mode==='strip'){\n          for(let i=2;i<verts.length;i++) tris.push(i-2,i-1,i);\n        } else {\n          for(let i=2;i<verts.length;i++) tris.push(0,i-1,i);\n        }\n      }\n      const lines=[\n        `Mode: ${mode}, Verts: ${verts.length}`,\n        '', \n        ...verts.map((v,i)=>`V${i+1}: (${v.x.toFixed(2)}, ${v.y.toFixed(2)})`),\n        '',\n        `Element Indices: [${elems.join(', ')}]`,\n        `Triangle Indices: [${tris.join(', ')}]`\n      ];\n      output.value=lines.join('\\n');\n    }<\/p>\n<p>    canvas.addEventListener('mousedown',e=>{\n      const r=canvas.getBoundingClientRect(), x=e.clientX-r.left, y=e.clientY-r.top;\n      for(let i=0;i<verts.length;i++){\n        const v=verts[i];\n        if((x-v.x)**2+(y-v.y)**2<=R*R){ drag=i; sel=i; return; }\n      }\n      addV(x,y);\n    });\n    canvas.addEventListener('mousemove',e=>{\n      const r=canvas.getBoundingClientRect(), x=e.clientX-r.left, y=e.clientY-r.top;\n      coords.textContent=`Maus: (${x.toFixed(0)}, ${y.toFixed(0)})`;\n      if(drag!==null){\n        const nx=Math.max(R,Math.min(canvas.width-R,x)), ny=Math.max(R,Math.min(canvas.height-R,y));\n        verts[drag]={x:nx,y:ny}; redraw();\n      }\n    });\n    canvas.addEventListener('mouseup',()=>{\n      if(drag!==null){ drag=null; recHistory(); redraw(); }\n    });\n    canvas.addEventListener('dragstart',e=>e.preventDefault());<\/p>\n<p>    window.addEventListener('keydown',e=>{\n      const k=e.key.toLowerCase();\n      if(e.ctrlKey&&k==='z'){ e.preventDefault(); undo(); }\n      else if(e.ctrlKey&&k==='y'){ e.preventDefault(); redo(); }\n      else if(k==='backspace'&&sel!==null){\n        e.preventDefault(); verts.splice(sel,1); recHistory(); sel=null; redraw();\n      }\n    });<\/p>\n<p>    clearB.addEventListener('click', clearAll);\n    modes.forEach(m=>m.addEventListener('change', redraw));<\/p>\n<p>    redraw();\n  })();\n  <\/script>\n<\/div>\n<\/div>\n<p><!--more--><br \/>\n<!-- {\"type\":\"layout\",\"children\":[{\"type\":\"section\",\"props\":{\"image_position\":\"center-center\",\"style\":\"default\",\"title_breakpoint\":\"xl\",\"title_position\":\"top-left\",\"title_rotation\":\"left\",\"vertical_align\":\"middle\",\"width\":\"default\"},\"children\":[{\"type\":\"row\",\"children\":[{\"type\":\"column\",\"props\":{\"image_position\":\"center-center\",\"position_sticky_breakpoint\":\"m\"},\"children\":[{\"type\":\"text\",\"props\":{\"column_breakpoint\":\"m\",\"content\":\"<!-- Triangle Strip \\\/ Fan Builder f\\u00fcr WordPress -->\\n<\/p>\n<div id=\\\"triangle-builder-container\\\" style=\\\"max-width:760px; margin:auto;\\\">\\n  <\/p>\n<style>\\n    \\\/* Scoped Styles *\\\/\\n    #triangle-builder-container * { box-sizing:border-box; }\\n    #triangle-builder-controls {\\n      display:flex; align-items:center; gap:12px;\\n      padding:12px 16px; background:#121214; border-radius:8px;\\n      margin-bottom:12px;\\n    }\\n    #triangle-builder-controls input[type=\\\"radio\\\"] { display:none; }\\n    \\\/* span als Block, nimmt ganze Label-Fl\\u00e4che ein *\\\/\\n    #triangle-builder-controls label span {\\n      display: block;\\n      width: 100%;\\n      padding: 8px 16px;\\n      border-radius: 4px;\\n      background: #2c2f36;\\n      color: #e0e0e0;\\n      text-align: center;\\n      transition: background .2s, color .2s;\\n    }\\n    #triangle-builder-controls label span:hover {\\n      background: #3a3f47;\\n    }\\n    \\\/* angew\\u00e4hltes span f\\u00e4rben *\\\/\\n    #triangle-builder-controls input[type=\\\"radio\\\"]:checked + span {\\n      background: #61dafb;\\n      color: #20232a;\\n    }\\n    #triangle-builder-clear {\\n      margin-left:auto; padding:8px 16px;\\n      background:#007acc; color:#fff; border:none; border-radius:4px;\\n      cursor:pointer; transition:background .2s;\\n    }\\n    #triangle-builder-clear:hover { background:#005fa3; }\\n\\n    .triangle-builder-canvas-wrap {\\n      background:#20232a; border-radius:8px; overflow:hidden;\\n      box-shadow:inset 0 0 6px rgba(0,0,0,0.4);\\n    }\\n    #triangle-builder-canvas { display:block; cursor:crosshair; }\\n\\n    #triangle-builder-status {\\n      margin-top:6px; font-size:.85rem; display:flex;\\n      justify-content:space-between; color:#bbb;\\n    }\\n\\n    #triangle-builder-output {\\n      width:100%; height:30vh; margin-top:12px; padding:8px;\\n      font-family:monospace; font-size:.9rem; background:#282c34;\\n      color:#abb2bf; border:none; border-radius:4px; resize:none;\\n      box-shadow:inset 0 0 4px rgba(0,0,0,0.5);\\n    }\\n  <\\\/style>\\n\\n  <\/p>\n<div id=\\\"triangle-builder-controls\\\">\\n    <label title=\\\"Modus Triangle Strip\\\">\\n      <input type=\\\"radio\\\" name=\\\"tb-mode\\\" value=\\\"strip\\\" checked>\\n      <span>Triangle Strip<\\\/span>\\n    <\\\/label>\\n    <label title=\\\"Modus Triangle Fan\\\">\\n      <input type=\\\"radio\\\" name=\\\"tb-mode\\\" value=\\\"fan\\\">\\n      <span>Triangle Fan<\\\/span>\\n    <\\\/label>\\n    <button id=\\\"triangle-builder-clear\\\">Clear<\\\/button>\\n  <\\\/div>\\n\\n  <\/p>\n<div class=\\\"triangle-builder-canvas-wrap\\\">\\n    <canvas id=\\\"triangle-builder-canvas\\\" width=\\\"700\\\" height=\\\"400\\\"><\\\/canvas>\\n  <\\\/div>\\n\\n  <\/p>\n<div id=\\\"triangle-builder-status\\\">\\n    <\/p>\n<div id=\\\"triangle-builder-coords\\\">Maus: \\u2013<\\\/div>\\n    <\/p>\n<div>Backspace: L\\u00f6schen<\\\/div>\\n  <\\\/div>\\n\\n  <textarea id=\\\"triangle-builder-output\\\" readonly><\\\/textarea>\\n\\n  <script>\\n  (function(){\\n    const canvas = document.getElementById('triangle-builder-canvas'),\\n          ctx    = canvas.getContext('2d'),\\n          output = document.getElementById('triangle-builder-output'),\\n          clearB = document.getElementById('triangle-builder-clear'),\\n          modes  = document.getElementsByName('tb-mode'),\\n          coords = document.getElementById('triangle-builder-coords');\\n\\n    const R=6, HP=3, GS=50;\\n    let verts=[], history=[[]], hi=0, drag=null, sel=null;\\n\\n    function recHistory(){\\n      history = history.slice(0,hi+1);\\n      history.push(JSON.parse(JSON.stringify(verts)));\\n      hi++;\\n    }\\n    function undo(){\\n      if(hi>0){ hi--; verts=JSON.parse(JSON.stringify(history[hi])); sel=null; redraw(); }\\n    }\\n    function redo(){\\n      if(hi+1<history.length){ hi++; verts=JSON.parse(JSON.stringify(history[hi])); sel=null; redraw(); }\\n    }\\n    function getMode(){\\n      return document.querySelector('input[name=\\\"tb-mode\\\"]:checked').value;\\n    }\\n    function clearAll(){\\n      verts=[]; history=[[]]; hi=0; sel=null; redraw();\\n    }\\n    function addV(x,y){\\n      verts.push({x,y}); recHistory(); sel=verts.length-1; redraw();\\n    }\\n    function drawGrid(){\\n      ctx.strokeStyle='#2c2f36'; ctx.lineWidth=1;\\n      for(let x=GS;x<canvas.width;x+=GS){ ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,canvas.height);ctx.stroke();}\\n      for(let y=GS;y<canvas.height;y+=GS){ ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(canvas.width,y);ctx.stroke();}\\n    }\\n    function drawTri(a,b,c){\\n      ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.lineTo(b.x,b.y);ctx.lineTo(c.x,c.y);ctx.closePath();ctx.stroke();\\n    }\\n    function redraw(){\\n      ctx.clearRect(0,0,canvas.width,canvas.height);\\n      drawGrid();\\n      const mode=getMode();\\n      if(verts.length>=3){\\n        ctx.strokeStyle='#61dafb';ctx.lineWidth=2;\\n        if(mode==='strip'){\\n          for(let i=2;i<verts.length;i++) drawTri(verts[i-2],verts[i-1],verts[i]);\\n        } else {\\n          const c=verts[0]; for(let i=2;i<verts.length;i++) drawTri(c,verts[i-1],verts[i]);\\n        }\\n      }\\n      ctx.font='12px sans-serif'; ctx.textAlign='left'; ctx.textBaseline='bottom';\\n      verts.forEach((v,i)=>{\\n        ctx.fillStyle='#fff';ctx.beginPath();ctx.arc(v.x,v.y,R,0,2*Math.PI);ctx.fill();\\n        ctx.fillText(`V${i+1}`,v.x+R+4,v.y-R-4);\\n      });\\n      if(sel!==null&&verts[sel]){\\n        const v=verts[sel]; ctx.strokeStyle='#ffd54f';ctx.lineWidth=2;\\n        ctx.beginPath();ctx.arc(v.x,v.y,R+HP,0,2*Math.PI);ctx.stroke();\\n      } else if(verts.length){\\n        const v=verts[verts.length-1]; ctx.strokeStyle='#ff6b6b';ctx.lineWidth=2;\\n        ctx.beginPath();ctx.arc(v.x,v.y,R+HP,0,2*Math.PI);ctx.stroke();\\n      }\\n      const elems=verts.map((_,i)=>i), tris=[];\\n      if(verts.length>=3){\\n        if(mode==='strip'){\\n          for(let i=2;i<verts.length;i++) tris.push(i-2,i-1,i);\\n        } else {\\n          for(let i=2;i<verts.length;i++) tris.push(0,i-1,i);\\n        }\\n      }\\n      const lines=[\\n        `Mode: ${mode}, Verts: ${verts.length}`,\\n        '', \\n        ...verts.map((v,i)=>`V${i+1}: (${v.x.toFixed(2)}, ${v.y.toFixed(2)})`),\\n        '',\\n        `Element Indices: [${elems.join(', ')}]`,\\n        `Triangle Indices: [${tris.join(', ')}]`\\n      ];\\n      output.value=lines.join('\\\\n');\\n    }\\n\\n    canvas.addEventListener('mousedown',e=>{\\n      const r=canvas.getBoundingClientRect(), x=e.clientX-r.left, y=e.clientY-r.top;\\n      for(let i=0;i<verts.length;i++){\\n        const v=verts[i];\\n        if((x-v.x)**2+(y-v.y)**2<=R*R){ drag=i; sel=i; return; }\\n      }\\n      addV(x,y);\\n    });\\n    canvas.addEventListener('mousemove',e=>{\\n      const r=canvas.getBoundingClientRect(), x=e.clientX-r.left, y=e.clientY-r.top;\\n      coords.textContent=`Maus: (${x.toFixed(0)}, ${y.toFixed(0)})`;\\n      if(drag!==null){\\n        const nx=Math.max(R,Math.min(canvas.width-R,x)), ny=Math.max(R,Math.min(canvas.height-R,y));\\n        verts[drag]={x:nx,y:ny}; redraw();\\n      }\\n    });\\n    canvas.addEventListener('mouseup',()=>{\\n      if(drag!==null){ drag=null; recHistory(); redraw(); }\\n    });\\n    canvas.addEventListener('dragstart',e=>e.preventDefault());\\n\\n    window.addEventListener('keydown',e=>{\\n      const k=e.key.toLowerCase();\\n      if(e.ctrlKey&&k==='z'){ e.preventDefault(); undo(); }\\n      else if(e.ctrlKey&&k==='y'){ e.preventDefault(); redo(); }\\n      else if(k==='backspace'&&sel!==null){\\n        e.preventDefault(); verts.splice(sel,1); recHistory(); sel=null; redraw();\\n      }\\n    });\\n\\n    clearB.addEventListener('click', clearAll);\\n    modes.forEach(m=>m.addEventListener('change', redraw));\\n\\n    redraw();\\n  })();\\n  <\\\/script>\\n<\\\/div>\\n\",\"margin\":\"default\"}}]}]}]}],\"version\":\"4.3.8\"} --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Triangle Strip Triangle Fan Clear Maus: \u2013 Backspace: L\u00f6schen<\/p>","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-3698","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Grafik-Primitive - AStA Hochschule Hannover<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/asta-hsh.de\/en\/grafik-primitive\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Grafik-Primitive - AStA Hochschule Hannover\" \/>\n<meta property=\"og:description\" content=\"Triangle Strip Triangle Fan Clear Maus: \u2013 Backspace: L\u00f6schen\" \/>\n<meta property=\"og:url\" content=\"https:\/\/asta-hsh.de\/en\/grafik-primitive\/\" \/>\n<meta property=\"og:site_name\" content=\"AStA Hochschule Hannover\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-22T14:44:11+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/grafik-primitive\\\/\",\"url\":\"https:\\\/\\\/asta-hsh.de\\\/grafik-primitive\\\/\",\"name\":\"Grafik-Primitive - AStA Hochschule Hannover\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/#website\"},\"datePublished\":\"2025-06-22T14:22:01+00:00\",\"dateModified\":\"2025-06-22T14:44:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/grafik-primitive\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/asta-hsh.de\\\/grafik-primitive\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/grafik-primitive\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/asta-hsh.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Grafik-Primitive\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/#website\",\"url\":\"https:\\\/\\\/asta-hsh.de\\\/\",\"name\":\"AStA HSH\",\"description\":\"Der Allgemeine Studierendenausschuss der Hochschule Hannover\",\"publisher\":{\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/asta-hsh.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/#organization\",\"name\":\"AStA Hochschule Hannover\",\"url\":\"https:\\\/\\\/asta-hsh.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"http:\\\/\\\/test.asta-hsh.de\\\/wp-content\\\/uploads\\\/2023\\\/06\\\/AStA-Logo.svg\",\"contentUrl\":\"http:\\\/\\\/test.asta-hsh.de\\\/wp-content\\\/uploads\\\/2023\\\/06\\\/AStA-Logo.svg\",\"width\":130,\"height\":89,\"caption\":\"AStA Hochschule Hannover\"},\"image\":{\"@id\":\"https:\\\/\\\/asta-hsh.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Grafik-Primitive - AStA Hochschule Hannover","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/asta-hsh.de\/en\/grafik-primitive\/","og_locale":"en_GB","og_type":"article","og_title":"Grafik-Primitive - AStA Hochschule Hannover","og_description":"Triangle Strip Triangle Fan Clear Maus: \u2013 Backspace: L\u00f6schen","og_url":"https:\/\/asta-hsh.de\/en\/grafik-primitive\/","og_site_name":"AStA Hochschule Hannover","article_modified_time":"2025-06-22T14:44:11+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/asta-hsh.de\/grafik-primitive\/","url":"https:\/\/asta-hsh.de\/grafik-primitive\/","name":"Grafik-Primitive - AStA Hochschule Hannover","isPartOf":{"@id":"https:\/\/asta-hsh.de\/#website"},"datePublished":"2025-06-22T14:22:01+00:00","dateModified":"2025-06-22T14:44:11+00:00","breadcrumb":{"@id":"https:\/\/asta-hsh.de\/grafik-primitive\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/asta-hsh.de\/grafik-primitive\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/asta-hsh.de\/grafik-primitive\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/asta-hsh.de\/"},{"@type":"ListItem","position":2,"name":"Grafik-Primitive"}]},{"@type":"WebSite","@id":"https:\/\/asta-hsh.de\/#website","url":"https:\/\/asta-hsh.de\/","name":"AStA HSH","description":"Der Allgemeine Studierendenausschuss der Hochschule Hannover","publisher":{"@id":"https:\/\/asta-hsh.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/asta-hsh.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/asta-hsh.de\/#organization","name":"AStA Hochschule Hannover","url":"https:\/\/asta-hsh.de\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/asta-hsh.de\/#\/schema\/logo\/image\/","url":"http:\/\/test.asta-hsh.de\/wp-content\/uploads\/2023\/06\/AStA-Logo.svg","contentUrl":"http:\/\/test.asta-hsh.de\/wp-content\/uploads\/2023\/06\/AStA-Logo.svg","width":130,"height":89,"caption":"AStA Hochschule Hannover"},"image":{"@id":"https:\/\/asta-hsh.de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/pages\/3698","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/comments?post=3698"}],"version-history":[{"count":9,"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/pages\/3698\/revisions"}],"predecessor-version":[{"id":3707,"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/pages\/3698\/revisions\/3707"}],"wp:attachment":[{"href":"https:\/\/asta-hsh.de\/en\/wp-json\/wp\/v2\/media?parent=3698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}