KonvaJS-오프셋을 사용하지 않고 커서 주위로 사각형 회전

체이스 레인즈

KonvaJS를 사용하여 사각형을 미리 정의 된 슬롯으로 끌어다 놓습니다. 일부 슬롯은 90도 회전해야합니다. 수직으로 회전하는 슬롯 주위에 히트 박스가 있으므로 사용자가 사각형을 영역으로 드래그하면 자동으로 90도 회전합니다 (방향과 일치). 회전하면 마우스 아래에서 밖으로 이동합니다. 이 문제는 오프셋으로 해결할 수 있지만 사각형은 스냅 후 상자와 시각적으로 일치하지 않습니다. 이것은 (아마) 추가 코드로 해결할 수 있습니다.

사각형을 회전 한 다음 마우스 아래로 이동하려고했습니다. 사용자가 여전히 드래그하고 있기 때문에 계획대로 작동하지 않는 것 같습니다.

오프셋을 사용하지 않고 마우스 아래에서 사각형을 강제로 회전시킬 수 있습니까?

다음은 문제를 보여주는 바이올린입니다. 오프셋 문제는 첫 번째 변수를 true로 설정하여 시연 할 수 있습니다. https://jsfiddle.net/ChaseRains/1k0aqs2j/78/

var width = window.innerWidth;
var height = window.innerHeight;

var rectangleLayer = new Konva.Layer();
var holdingSlotsLayer = new Konva.Layer();
var controlLayer = new Konva.Layer();
var stage = new Konva.Stage({
  container: 'container',
  width: width,
  height: height,
  draggable: true
});
//vertical holding spot
holdingSlotsLayer.add(new Konva.Rect({
  x: 300,
  y: 25,
  width: 130,
  height: 25,
  fill: '#fff',
  draggable: false,
  rotation: 90,
  stroke: '#000'
}));

//horizontal holding spot
holdingSlotsLayer.add(new Konva.Rect({
  x: 25,
  y: 75,
  width: 130,
  height: 25,
  fill: '#fff',
  draggable: false,
  rotation: 0,
  stroke: '#000'
}));

//mask to set boundaries around where we wannt to flip the rectangle
controlLayer.add(new Konva.Rect({
  x: 215,
  y: 15,
  width: 150,
  height: 150,
  fill: '#fff',
  draggable: false,
  name: 'A',
  opacity: 0.5
}));
stage.add(holdingSlotsLayer, controlLayer);

//function for finding intersections
function haveIntersection(placeHolder, rectangle, zone) {
  if (rectangle.rotation == 0 || zone == true) {
    return !(
      rectangle.x > placeHolder.x + placeHolder.width ||
      rectangle.x + rectangle.width < placeHolder.x ||
      rectangle.y > placeHolder.y + placeHolder.height ||
      rectangle.y + rectangle.height < placeHolder.y
    );
  } else {
    return !(
      rectangle.x > placeHolder.x + 25 ||
      rectangle.x + rectangle.width < placeHolder.x ||
      rectangle.y > placeHolder.y + placeHolder.height + 90 ||
      rectangle.y + rectangle.height < placeHolder.y
    );
  }
}

//function to create rectangle group (so we can place text on the rectangle)
function spawnRectangle(angle) {
  var rectangleGroup = new Konva.Group({
    x: 95,
    y: 95,
    width: 130,
    height: 25,
    rotation: angle,
    draggable: true,
  });

  rectangleGroup.add(new Konva.Rect({
    width: 130,
    height: 25,
    fill: 'lightblue'
  }));

  rectangleGroup.add(new Konva.Text({
    text: '123',
    fontSize: 18,
    fontFamily: 'Calibri',
    fill: '#000',
    width: 130,
    padding: 5,
    align: 'center'
  }));

  //function tied to an on drag move event
  rectangleGroup.on('dragmove', (e) => {
    //shrink rectangle hitbox for use in placeholder intersection
    var dimensions = {
      "height": 3,
      "width": 5,
      "x": e.target.attrs.x,
      "y": e.target.attrs.y,
      'rotation': e.target.attrs.rotation
    };
    //loop over holding slots to see if there is an intersection.
    for (var i = 0; holdingSlotsLayer.children.length > i; i++) {
      //if true, change the look of the slot we are hovering
      if (haveIntersection(holdingSlotsLayer.children[i].attrs, dimensions, false)) {
        holdingSlotsLayer.children[i].attrs.fill = '#C41230';
        holdingSlotsLayer.children[i].attrs.dash = [10, 3];
        holdingSlotsLayer.children[i].attrs.stroke = '#000';
        //set attributes back to normal otherwise
      } else {
        holdingSlotsLayer.children[i].attrs.fill = '#fff';
        holdingSlotsLayer.children[i].attrs.dash = null;
        holdingSlotsLayer.children[i].attrs.stroke = null;
      }
    }

    //check to see if we are in a zone that requires the rectangle to be flipped 90 degrees 
    if (haveIntersection(controlLayer.children[0].attrs, dimensions, true)) {
      if (rectangleGroup.attrs.rotation != 90) {
        rectangleGroup.attrs.rotation = 90;
      }
    } else {
      rectangleGroup.attrs.rotation = 0;
    }

    stage.batchDraw();
  });

  rectangleGroup.on('dragend', (e) => {

    for (var i = 0; holdingSlotsLayer.children.length > i; i++) {
      //If the parking layer has an element that is lit up, then snap to position.. 
      if (holdingSlotsLayer.children[i].attrs.fill == '#C41230') {
        rectangleGroup.position({
          x: holdingSlotsLayer.children[i].attrs.x,
          y: holdingSlotsLayer.children[i].attrs.y
        });
        holdingSlotsLayer.children[i].attrs.fill = '#fff';
        holdingSlotsLayer.children[i].attrs.dash = null;
        holdingSlotsLayer.children[i].attrs.stroke = null;
      }
    }

    stage.batchDraw();
  });


  rectangleLayer.add(rectangleGroup);
  stage.add(rectangleLayer);
}
body {
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: #D3D3D3;
  background-size: cover;
}

#desc {
  position: absolute;
  top: 5px;
  left: 5px;
}
<script src="https://unpkg.com/[email protected]/konva.min.js"></script>

<body>
  <div id="container"></div>
  <div id="desc">
    <button onclick="spawnRectangle(0)">spawn rectangle</button>
  </div>
</body>

정복당한 웜뱃

다음은 konva offset ()을 사용하지 않고 마우스 아래의 사각형을 회전하는 간단한 함수입니다. 움직임을 적용하기 위해 트윈을 사용했지만 트윈없이 사용하려면 rect.rotate ()를 적용한 다음 newPos x & y를 위치로 적용하십시오.

편집 : OP는 클릭하면 사각형이 애니메이션을 완료하는 동안 마우스를 누른 다음 드래그하면 사각형이 튀어 나올 것이라고 지적했습니다. 무엇을 제공합니까? 마우스 다운 이벤트가 실행되면 Konva는 내부 드래그 기능에서 도형의 초기 위치를 기록합니다. 그런 다음 실제로 마우스를 끌기 시작하면 Konva는 계산 된 위치에서 모양을 충실하게 다시 그립니다. 이제 '우리'는 코드에서 모양을 옮겼다는 것을 알고 있지만 Konva가 우리의 트릭을 사용하도록 허용하지 않았습니다.

해결 방법은

 rect.stopDrag(); 
 rect.startDrag();

새로운 위치가 설정된 직후. 트윈을 사용하고 있기 때문에 트윈 중 하나의 onFinish () 콜백 함수에서이 작업을 수행합니다. 둘 이상을 적용하는 경우 최종 트윈이되도록해야합니다. 내 트윈이 같은 기간에 실행되기 때문에 나는 그것을 피했습니다. 트윈을 사용하지 않는 경우에는 모양에 마지막 rotate () 또는 position () 호출을 적용한 후 즉시 위를 호출하십시오.

function rotateUnderMouse(){


  // Get the stage position of the mouse
  var mousePos = stage.getPointerPosition();

  // get the stage position of the mouse
  var shapePos = rect.position();

  // compute the vector for the difference
  var rel = {x: mousePos.x - shapePos.x, y: mousePos.y - shapePos.y} 

  // Now apply the rotation
  angle = angle + 90;


  // and reposition the shape to keep the same point in the shape under the mouse 
  var newPos = ({x: mousePos.x  + rel.y , y: mousePos.y - rel.x}) 

  // Just for fun, a tween to apply the move: See https://konvajs.org/docs/tweens/Linear_Easing.html
  var tween1 = new Konva.Tween({
    node: rect,
    duration: 0.25,
    x:  newPos.x,
    y: newPos.y,
    easing: Konva.Easings.Linear,
    onFinish: function() { rect.stopDrag(); rect.startDrag();}
  });
  
  // and a tween to apply the rotation 
  tween2 = new Konva.Tween({
    node: rect,
    duration: 0.25,
    rotation: angle,
    easing: Konva.Easings.Linear
  });
    
  
  tween2.play();
  tween1.play();


  
}


function setup() {

// Set up a stage and a shape
stage = new Konva.Stage({
  container: 'canvas-container',
  width: 650,
  height: 300
});


layer = new Konva.Layer();
stage.add(layer);

newPos = {x: 80, y: 40};
rect = new Konva.Rect({
   width: 140, height: 50, x: newPos.x, y: newPos.y, draggable: true, stroke: 'cyan', fill: 'cyan'
  })
layer.add(rect);

stage.draw()

rect.on('mousedown', function(){
  rotateUnderMouse()
})

}

var stage, layer, rect, angle = 0;

setup()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/konva/4.0.13/konva.js"></script>

<p>Click the rectangle - it will rotate under the mouse.</p>

<div id="canvas-container"></div>

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

webgl은 변환 행렬을 사용하지 않고 정점 셰이더에서 삼각형을 회전

분류에서Dev

Julia에서 PyPlot을 사용하여 특정 지점을 중심으로 사각형 회전

분류에서Dev

기존 PDF에서 사각형을 사용하여 회전으로 PDF 페이지 축소

분류에서Dev

기존 PDF에서 사각형을 사용하여 회전으로 PDF 페이지 축소

분류에서Dev

자바-정사각형을 애니메이션 할 수없고 회전하는 정사각형으로 나옴

분류에서Dev

내부 정사각형 배열을 움직이지 않은 채로두고 외부 N x N 정사각형 배열을 회전합니다.

분류에서Dev

회전 행렬을 사용하여 오일러 각도 오프셋

분류에서Dev

커서와 루프를 사용하지 않고 각 행에 대해 프로 시저를 호출합니까?

분류에서Dev

JavaFX는 모서리를 중심으로 사각형을 회전합니다.

분류에서Dev

대상 오프셋을 사용하여 Excel에서 셀 범위 지우기

분류에서Dev

회전하려고 할 때 스탬프 주석 텍스트와 사각형 테두리가 잘못 표시됨

분류에서Dev

오프셋이있는 날짜 문자열을 오프셋을 무시하고 사용자 지정 형식으로 변환

분류에서Dev

행렬을 사용하지 않고 하나의 변수로 선형 회귀를위한 비용 함수 계산

분류에서Dev

두 개의 직사각형을 전체적으로 회전

분류에서Dev

인코딩을 세 번째 매개 변수로 전달하는 것은 더 이상 사용되지 않습니다. 명시 적 제로 오프셋 사용

분류에서Dev

이미지 버튼을 움직이지 않고 주위로 회전

분류에서Dev

열거 형을 키 유형으로 사용하지만`?`를 사용하여 TypeScript에서 정의되지 않은 것으로 표시하지 않고 for 루프로 유형화 된 사전 생성

분류에서Dev

파이썬 | 직사각형을 회전하고 새로운 경계 치수를 얻습니다.

분류에서Dev

Excel (2013)에서 명명 된 범위를 사용할 때 전체 범위를 표시하지만 한 셀을 오프셋하는 방법은 무엇입니까?

분류에서Dev

Ubuntu Gnome으로 전환하지 않고 Ubuntu 위에서 그놈을 사용하는 방법

분류에서Dev

회전하는 스프라이트로 사각형을 회전시키는 방법

분류에서Dev

주의 사항 : 정의되지 않은 오프셋 : PHP에서 배열을 통한 루프가있는 4

분류에서Dev

변환 행렬을 사용하여 임의의 점 주위로 회전

분류에서Dev

사용자 상호 작용 삼각형을 표시하지 않고 각도 데이터 테이블 주문

분류에서Dev

기울어지고 회전 된 사각형의 경계 상자 가져 오기

분류에서Dev

과거 평균을 얻기 위해 오프셋을 사용하여 PromQL에서 여러 하위 쿼리 방지

분류에서Dev

메타 데이터 회전 태그를 사용하지 않고 Android에서 Mp4 회전

분류에서Dev

경계 직사각형 및 각도에서 회전 된 직사각형 좌표 가져 오기

분류에서Dev

VBA에서 오프셋을 사용하여 동적 범위 복사

Related 관련 기사

  1. 1

    webgl은 변환 행렬을 사용하지 않고 정점 셰이더에서 삼각형을 회전

  2. 2

    Julia에서 PyPlot을 사용하여 특정 지점을 중심으로 사각형 회전

  3. 3

    기존 PDF에서 사각형을 사용하여 회전으로 PDF 페이지 축소

  4. 4

    기존 PDF에서 사각형을 사용하여 회전으로 PDF 페이지 축소

  5. 5

    자바-정사각형을 애니메이션 할 수없고 회전하는 정사각형으로 나옴

  6. 6

    내부 정사각형 배열을 움직이지 않은 채로두고 외부 N x N 정사각형 배열을 회전합니다.

  7. 7

    회전 행렬을 사용하여 오일러 각도 오프셋

  8. 8

    커서와 루프를 사용하지 않고 각 행에 대해 프로 시저를 호출합니까?

  9. 9

    JavaFX는 모서리를 중심으로 사각형을 회전합니다.

  10. 10

    대상 오프셋을 사용하여 Excel에서 셀 범위 지우기

  11. 11

    회전하려고 할 때 스탬프 주석 텍스트와 사각형 테두리가 잘못 표시됨

  12. 12

    오프셋이있는 날짜 문자열을 오프셋을 무시하고 사용자 지정 형식으로 변환

  13. 13

    행렬을 사용하지 않고 하나의 변수로 선형 회귀를위한 비용 함수 계산

  14. 14

    두 개의 직사각형을 전체적으로 회전

  15. 15

    인코딩을 세 번째 매개 변수로 전달하는 것은 더 이상 사용되지 않습니다. 명시 적 제로 오프셋 사용

  16. 16

    이미지 버튼을 움직이지 않고 주위로 회전

  17. 17

    열거 형을 키 유형으로 사용하지만`?`를 사용하여 TypeScript에서 정의되지 않은 것으로 표시하지 않고 for 루프로 유형화 된 사전 생성

  18. 18

    파이썬 | 직사각형을 회전하고 새로운 경계 치수를 얻습니다.

  19. 19

    Excel (2013)에서 명명 된 범위를 사용할 때 전체 범위를 표시하지만 한 셀을 오프셋하는 방법은 무엇입니까?

  20. 20

    Ubuntu Gnome으로 전환하지 않고 Ubuntu 위에서 그놈을 사용하는 방법

  21. 21

    회전하는 스프라이트로 사각형을 회전시키는 방법

  22. 22

    주의 사항 : 정의되지 않은 오프셋 : PHP에서 배열을 통한 루프가있는 4

  23. 23

    변환 행렬을 사용하여 임의의 점 주위로 회전

  24. 24

    사용자 상호 작용 삼각형을 표시하지 않고 각도 데이터 테이블 주문

  25. 25

    기울어지고 회전 된 사각형의 경계 상자 가져 오기

  26. 26

    과거 평균을 얻기 위해 오프셋을 사용하여 PromQL에서 여러 하위 쿼리 방지

  27. 27

    메타 데이터 회전 태그를 사용하지 않고 Android에서 Mp4 회전

  28. 28

    경계 직사각형 및 각도에서 회전 된 직사각형 좌표 가져 오기

  29. 29

    VBA에서 오프셋을 사용하여 동적 범위 복사

뜨겁다태그

보관