[과제] 2주차) Basic Programming 김두람 #59
alpakaDurumi
started this conversation in
Blog
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
개요
Excalidraw을 참고하여 드로잉 앱을 만들어봤습니다. 5가지의 툴을 바꿔가며 자유롭게 화이트보드에 그림을 그릴 수 있습니다.
브랜치 링크
기능
사용할 수 있는 도구는 아래와 같습니다.
시연
Sketch.mp4
코드 설명
Pen
clickdown()에서 클릭 시 시작 지점을 설정한 후,motion()에서lineTo를 사용해 점을 잇습니다.clickdown()의lineTo()는 마우스를 움직이지 않은 상태에서clickdown()과clickup()만이 호출되는 케이스에 대해 점을 찍기 위해서 존재합니다.Rect/Circle
clickdown()에서 마우스가 클릭된 좌표를 기억하고,motion()에서는 매 프레임reset()을 호출하며 드래그하는 위치에 따라 그립니다.Eraser
Eraser 툴을 선택한 상태에서 클릭 또는 드래그를 통해 물체와 접촉하게 되면
pending에 해당Shape를 추가하며,마우스를 뗐을 때 처리합니다.
Select
선택한 물체, 그리고 그에 대한 bounding box, 좌표를 변수에 저장하여 사용합니다.
clickdown()에서 물체 선택 여부를 판단하고, 선택된 물체에 대해 변환 행렬을 쿼리한 후 translation 성분을 추출합니다.이후,
motion()에서 마우스 드래그에 따라 물체를 이동시킵니다.drawSelectedBox()는 bounding box를 계산하여 점선으로 해당 구역을 그립니다.UI
좌측 메뉴는
Scene위에 버튼(Shape+Text)을 얹어 구성했습니다. 버튼은 '{클릭 영역, 콜백 함수}' 형태로 목록에 등록해두고,clickdown()에서 클릭 좌표가 어느 버튼 영역에 속하는지 검사해 등록된 콜백을 실행하는 방식입니다.라벨 중앙 정렬에는
Text::align/Text::layout을, 메뉴 그림자에는Scene::add(SceneEffect::DropShadow, ...)를 사용했습니다.사용한 ThorVG API 목록
Shape::gen/Text::gen/Scene::genShape::moveTo/Shape::lineToShape::appendRect/Shape::appendCircleShape::resetShape::fillShape::strokeWidthShape::strokeFillShape::strokeCap/Shape::strokeJoinShape::strokeDashText::loadText::font/Text::size/Text::text/Text::fillText::align/Text::layoutPaint::translatePaint::transformPaint::boundsPaint::intersectsScene::add/Scene::removeScene::add(SceneEffect::DropShadow, ...)Canvas::add/Canvas::removeCanvas::updateTODO
All reactions