키네틱 js.my 문제를 사용하여 두 개의 드래그 가능한 베 지어 곡선과 원을 그린다. 마스크 영역을 찾고 싶다. 베 지어와 원의 교차점을 찾을 수있는 방법이있다. 아니면 나에게 가장 좋은 방법을 제안해라. 마스크가 적용된 영역에 이미지를 그려야합니다.Kinetic.js를 사용하여 마스킹하기
1
A
답변
2
합성은 쉽고 빠르게 교차를 마스크 할 수 있지만 KineticJS는 합성 방법을 기본 제공 방법으로 제공하지 않습니다.
특히, '소스 인'합성 기존 형상의 교차점과 새로 그려진 형상을 표시한다. 따라서 기존 곡선 위에 새 원을 그릴 때 원의 교차 만 & 곡선 만 남습니다.
임시 해결책은 메모리 내 html5 캔버스를 사용하여 합성 작업을 수행 한 다음 해당 캔버스를 Kinetic.Image의 소스로 사용하는 것입니다. 여기
그것을 수행하는 방법의 개요입니다 : 당신의 베 지어 곡선 그리기var compositingCanvas=document.createElement('canvas');
var context=compositingCanvas.getContext('2d');
context.moveTo
및 context.bezierCurveTo
설정 합성을 사용하여 :
메모리 내 캔버스 만들기 소스 입력 :
context.globalCompositeOperation='source-in';
소스로 compositingCanvas를 사용하여 Kinetic.Image 만들기
context.arc
를 사용하여 원을 그립니다 :
var myMaskedShape=new Kinetic.Image({
image:compositingCanvas,
....
});
[HTML5 캔버스 데모 코드 보여주는 합성 추가] 다음은 html5 Canvas에서 합성을 사용하여 렌즈 이미지를 아이 - 베 지어와 망막 원의 교차점으로 제한하는 방법의 예입니다. 이 html5 Canvas를 Kinetic.Image의 이미지 소스로 사용할 수 있습니다 (예 ... html5 캔버스가 Kinetic.Image의 소스가 될 수 있습니다!).
프로젝트가 성공적으로 완료되었습니다.
var canvas=document.createElement("canvas");
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width=300;
var ch=canvas.height=300;
ctx.lineWidth=2;
var img=new Image();
img.onload=function(){
drawEye(null,'black');
ctx.globalCompositeOperation='source-in';
drawRetina(null,'black');
ctx.drawImage(img,173-38,150-38,img.width,img.height);
ctx.globalCompositeOperation='source-over';
drawEye('black',null);
}
img.src='https://dl.dropboxusercontent.com/u/139992952/multple/stars.png';
function drawEye(stroke,fill){
ctx.beginPath();
ctx.moveTo(225,150);
ctx.bezierCurveTo(189,135, 83,75, 75,150);
ctx.bezierCurveTo(83,225, 189,165, 225,150);
ctx.closePath();
if(fill){ ctx.fill(); }
if(stroke){ ctx.stroke(); }
}
function drawRetina(stroke,fill){
ctx.beginPath();
ctx.arc(173,150,38,0,Math.PI*2);
ctx.closePath();
if(fill){ ctx.fill(); }
if(stroke){ ctx.stroke(); }
}
function drawEye1(stroke,fill){
ctx.beginPath();
ctx.moveTo(150,100);
ctx.bezierCurveTo(125,90, 55,50, 50,100);
ctx.bezierCurveTo(55,150, 125,110, 150,100);
ctx.closePath();
if(fill){ ctx.fill(); }
if(stroke){ ctx.stroke(); }
}
var canvas=document.createElement("canvas");
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width=300;
var ch=canvas.height=300;
ctx.lineWidth=2;
var img=new Image();
img.onload=function(){
drawEye(null,'black');
ctx.globalCompositeOperation='source-in';
drawRetina(null,'black');
ctx.drawImage(img,173-38,150-38,img.width,img.height);
ctx.globalCompositeOperation='source-over';
drawEye('black',null);
}
img.src='https://dl.dropboxusercontent.com/u/139992952/multple/stars.png';
function drawEye(stroke,fill){
ctx.beginPath();
ctx.moveTo(225,150);
ctx.bezierCurveTo(189,135, 83,75, 75,150);
ctx.bezierCurveTo(83,225, 189,165, 225,150);
ctx.closePath();
if(fill){ ctx.fill(); }
if(stroke){ ctx.stroke(); }
}
function drawRetina(stroke,fill){
ctx.beginPath();
ctx.arc(173,150,38,0,Math.PI*2);
ctx.closePath();
if(fill){ ctx.fill(); }
if(stroke){ ctx.stroke(); }
}
function drawEye1(stroke,fill){
ctx.beginPath();
ctx.moveTo(150,100);
ctx.bezierCurveTo(125,90, 55,50, 50,100);
ctx.bezierCurveTo(55,150, 125,110, 150,100);
ctx.closePath();
if(fill){ ctx.fill(); }
if(stroke){ ctx.stroke(); }
}
<h4>Intersection of eye & retina filled with image using compositing</h4>
<canvas id="canvas" width=300 height=300></canvas>
안녕하세요 marKE..my 정확한 문제는 사용자가 제 좌안 형상 영역을 선택하고 그 왼쪽 망막 형상 맞아 대한 동일한 후 망막 안구 형상 서클 베 지어 곡선 사용되고 .i 베 지어와 원 사이의 공통 영역을 찾고 싶습니다. http://www.freshlook.com과 같은 렌즈 이미지를 배치 할 수 있습니다. i는 운동에 새로운 것입니다. 이전에 구성을 시도했지만 얻을 수 없습니다. 정확한 결과. – Ahtisham
합성을 사용하여 렌즈를 눈 - 베 지어와 망막 원의 교차점으로 제한하는 방법을 보여주는 예제 코드를 추가했습니다. 프로젝트에 행운을 빌어 요! – markE
내 problem.i에 대한 해결책을 제공하는 고마워 마크 내 문제에 따라 그것을 사용자 정의 할 것입니다. – Ahtisham