2022年10月26日水曜日

2Dでの線と線の交差判定

 線と線の交差判定



<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.js"></script>
<div id="p5canvas"></div>
<script>   

let lp1; //line 1 point 1
let lp2; //line 1 point 2
let lp3; //line 2 point 1
let lp4; //line 2 point 2
let lpm1;//line 3 point 1 mousexy
let lpm2;//line 3 point 2 

function setup() {
	let sqsize=50;
	createCanvas(400, 400).parent("p5canvas");
	textSize(20);
	lp1=createVector(width / 2-sqsize, height / 2-sqsize);
	lp2=createVector(width / 2+sqsize, height / 2+sqsize);
	lp3=createVector(width / 2-sqsize, height / 2+sqsize);
	lp4=createVector(width / 2+sqsize, height / 2-sqsize);
	lpm1=createVector(width / 2-30, height / 2);
	lpm2=createVector(0,0);
}
function mousePressed() {
	lpm1.set(mouseX,mouseY);
}

function crosscheck( p1,p2,p3,p4)
{
  let a1, a2;
  a1 = (p3.x * p2.y - p3.x * p1.y - p1.x * p2.y + p1.x * p1.y - p2.x * p3.y + p2.x * p1.y + p1.x * p3.y - p1.x * p1.y)*
  (p4.x * p2.y - p4.x * p1.y - p1.x * p2.y + p1.x * p1.y - p2.x * p4.y + p2.x * p1.y + p1.x * p4.y - p1.x * p1.y);
  a2 = (p4.x * p1.y - p4.x * p3.y - p3.x * p1.y + p3.x * p3.y - p1.x * p4.y + p1.x * p3.y + p3.x * p4.y - p3.x * p3.y)*
  (p4.x * p2.y - p4.x * p3.y - p3.x * p2.y + p3.x * p3.y - p2.x * p4.y + p2.x * p3.y + p3.x * p4.y - p3.x * p3.y);
  if(a1<=0&&a2<=0)
     return true;
  else
    return false;
}
function draw() {
	background(100);	
		
	strokeWeight(4);
	stroke(155,255,155);
	line(lp1.x,lp1.y,lp2.x,lp2.y); 
	
	stroke(150,255,255);
	line(lp3.x,lp3.y,lp4.x,lp4.y); 
	
	stroke(0,255,100);
	lpm2.set(mouseX,mouseY);
	line(lpm1.x,lpm1.y,lpm2.x,lpm2.y); 
	
	noStroke();
	fill(255);
	text(crosscheck(lpm1,lpm2,lp1,lp2),10,30);
	text(crosscheck(lpm1,lpm2,lp3,lp4),10,60);
}
</script>

2022年10月25日火曜日

2D ベクトルのdot積とcloss積の使いどころ

 以前組んだプログラムのベクトルのコードを見直した

ドット積とクロス積の使いどころがわかった

"白"が進行方向 "緑"がターゲットへのベクトルの時

ドット積はターゲットが前方180°以内にあれば正

後方だと負になるようだ

クロス積はターゲットが右に居るか左に居るかで正負が

分かれるようだ

vector に.dot()があるが.closs()がvectorオブジェクトを返してくるので

計算式にした(計算結果は同じだった)



<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.js"></script>
<div id="p5canvas"></div>
<script>   

let posmouse; //mouse position
let postarget; //target position

let v1;		//mouse to target 
let v2;		//mouse move direction
let vdot;	//dot product 

function setup() {
	createCanvas(400, 400).parent("p5canvas");
	postarget = createVector(width / 2, height / 2);
	posmouse = createVector(mouseX,mouseY);
	v1=createVector(0,1);
	v2=createVector(1,0);
	textSize(20);
}
function mousePressed() {
	v2=p5.Vector.sub(postarget,posmouse);
	v2.normalize();	
}


function draw() {
	background(100);
	
	posmouse.set(mouseX,mouseY);	
	v1=p5.Vector.sub(postarget,posmouse);
	v1.normalize();
	
	noStroke();
	fill(255);
	
	vdot=v1.x*v2.x+v1.y*v2.y;		//dot product
	text("dot  : "+vdot.toFixed(3),10,30);
	vdot=v1.x*v2.y-v1.y*v2.x;		//closs product
	text("closs:"+vdot.toFixed(3),10,60);

	strokeWeight(4);
	noFill();	
	
	stroke(155,255,155);
	circle(postarget.x,postarget.y,50);	
	stroke(150,255,255);
	circle(posmouse.x,posmouse.y,50);
	
	stroke(0,255,100);
	v1.mult(50);	
	v1.add(posmouse);	
	line(v1.x,v1.y,posmouse.x,posmouse.y); 
		
	let v3=v2.copy();
	v3.mult(50);
	v3.add(posmouse);
	stroke(255,255,200);	
	line(v3.x,v3.y,posmouse.x,posmouse.y);
}
</script>

p5jsでpngをBase64文字列にしてコードに埋め込んでspriteに









Blogger上でp5jsでsprites用の画像を扱うのが面倒そうなので
文字列にして埋め込んでみる
変換コードもコピペしたので残す 
imageで読み込む際に文字列の頭にこれをつける'data:image/png;base64,'


<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.js"></script>
<div id="p5canvas"></div>
<script>   

let img;
let spx=10;
let spy=10;
let timer=0;

function setup() {
  createCanvas(400, 200).parent("p5canvas");
  frameRate(30);
  img = loadImage('data:image/png;base64,'+
  'iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAMAAABA3o1rAAADAFBMVEUAiACIAIi7u7uqzO4AAAAzIiJEMzOId2aZiIi7qqrdzLv/7t3///9VEQB3EQCqIgDMMwD/RAD/dxH/uxH/3SL/7ncRIndEVf9mzP+I3f+7//+ZzO677v8zRBEzZhGI3QC7/wARmXciAEREEVXMZojumar/zN27RFXuu8x3MyKZRETMd2b/mZkzIhFVMyKIVUSZd1W7iGbMqnfuzKr/3cwiEQBEIhGqZiLMdzPdiETumVX/u2b/3Yjd3VURMzMRd3cRu7sR//93ZruZd+4zM2ZmZpmZiLvMu+7//+6ZmaqIiIj/AP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP+9hPPFAAAAAXRSTlMAQObYZgAAAAd0SU1FB+YKGQQ3OaNj0msAAAFZSURBVHjaZVFdSwJBFD3jbpbrVysLPWwamKyW9AX2kOgfsN9bL73agxDRB7Ti2hayllIQtBuVrU53RqOvC3PnzNxzDvfOIJGAjNkmQ1XV6ZanFBAjmJZLbZH3Ow70pEC+ZCGo2xskWDiiGg5QkB6TbzcYk+LElnj1EhmGw4YDrdCl85ZIqgHO06/bvGM8NhXk4eouwF6EIJAOFhFQ9+6K7Mt2mHnm9/CwPBCnCO94Y6DrO5wkwXRBiExOicwMKyV1JxizvETXeJorwd4BYp5LTeIhdoo1wLLB2RXWBSc7gH4LJEU7GaRzQC+t8TaynMbRFHqAPenVd8WYWAG80eIFXRgsh4/zEWD2Zo8QggFxPYxw/y0EasM+zKUmVHM2UF8Qqi7zd9ul0TFq86RQw/fmj29BhJpUUo4ipjxTb1ottPA3tAr9REUgi3Ij/o9QLgPFqkDRKK3N39VPI2h1VzbxKN4AAAAASUVORK5CYII=');
}

function draw() {
	background(0);
	img.resize(32*4,16*4);
	
    if(spx>mouseX)spx--;else if(spx<mouseX) spx++;
    if(spx<0)spx=0;if(spx>350)spx=350;
    if(spy>mouseY)spy--;else if(spy<mouseY)  spy++;    
    if(spy<0)spy=0;if(spy>150)spy=150;
    timer++;
    if(timer>5000)timer=0;
    let flg=parseInt(timer/8)%2;
    image(img, 10, 10, 10*4, 16*4, 10*4, 0, 10*4,16*4);
    image(img, 90, 15, 10*4, 16*4, 0, 0, 10*4,16*4);
    image(img, 150, 30, 10*4, 16*4, 20*4, 0, 10*4,16*4);
    if(flg==0)
    	image(img, spx, spy, 10*4, 16*4, 0, 0, 10*4,16*4);
    else
    image(img, spx, spy+4, 10*4, 15*4, 0, 0, 10*4,16*4);    	
}
</script>

2022年10月23日日曜日

Dall-EとMidjourneyにスプライト用ドット絵を作ってもらう

ドット絵が必要になった AIがに試しに描いてもらった

キーワードはこれ

”pixelart table fantasy cute characters sprites girls cats half   Roguelike maid  quarter view”

Dall-E

NES寄りなドットを作ってくれる







Midjourney

pixelart 寄りなドット絵ができる



つかえそう

ドット絵にする際に使用した

image to pixel のサイト

https://giventofly.github.io/pixelit/#tryit










2022年10月22日土曜日

Blogger で p5js textarea scrollbar

この間のスクロールバー云々をBlogger上でデモ




<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.js"></script><div id="p5canvas"></div>
<script>
let myTextArea;

function setup() {
  createCanvas(400, 300).parent("p5canvas");
  // init textarea
  myTextArea = createElement('textarea').parent("p5canvas");
  myTextArea.attribute("rows","5");
  myTextArea.attribute("cols","20");
  myTextArea.value('0\n1\n2\n3\n4\n5\n6\n7\n0\n1\n2\n3\n4\n5\n6\n7');
  myTextArea.position(20,20);
 }

function draw() {
  background(220);  
  text(" scrollTop "+myTextArea.elt.scrollTop ,20,280); 
}
</script>

2022年10月19日水曜日

Blogger でp5jsがつかえた

”HTMLビュー”でHTMLを編集  divとcanvasを関連付ければ良いみたい

(div id="p5canvas とcreateCanvasの.parent("p5canvas");)

p5js本体はCDNを参照(https://cdnjs.com/libraries/p5.js)

コードはP5サイトのEXAMPLEから(https://p5js.org/examples/3d-geometries.html)


<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.js"></script>
<div id="p5canvas"></div>
<script> 
function setup() {
  createCanvas(710, 400, WEBGL).parent("p5canvas");
}

function draw() {
  background(250);

  translate(-240, -100, 0);
  normalMaterial();
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  plane(70);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  box(70, 70, 70);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  cylinder(70, 70);
  pop();

  translate(-240 * 2, 200, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  cone(70, 70);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  torus(70, 20);
  pop();

  translate(240, 0, 0);
  push();
  rotateZ(frameCount * 0.01);
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  sphere(70);
  pop();
}
</script>

raspiでseleniumの自動化用のファイル作り直し

2024/2/17に不注意でraspiのsdカードを壊し jupyterファイルのバックアップを取らずにos再インストールを試みるという 愚行を重ねたためまたjupyterで作業ファイルを作ることになったので念の為 残しておく 途中なので要らない行も有るかも これだけ再現できれば...