Coding/JavsScript 삽질기2019. 11. 26. 01:35

소개:  https://chobocho.tistory.com/2461396

실행하기: http://www.chobocho.com/javascript/painter.html

전체 소스코드: https://github.com/chobocho/painter

 

경고  

  • 주인장은 자바스크립트 초보입니다.  

  • 자바스크립트 고수의 비급을 원하시는 분은 다른 자료를 참고 하시기 바랍니다.  

  • 과도한 기대는 과도한 실망을 가져옵니다.    

  • 본 강의는 자바스크립트만 사용합니다.  

  • 크롬에서의 동작만 보장 합니다.  

  • Canvas 기초 사용법은 구글링하시면 친절한 강의가 많습니다

 

4.1 Drawing state


그림판에서 사각형을 그리고자 할 때, 

먼저 시작 점에서 마우스의 왼쪽 버튼을 누르고,  

원하는 크기로 마우스를 드래그 하고, 

마우스의 왼쪽 버튼 누르기를 중단하면 화면에 사각형이 그려집니다.  

이 것을 State Diagram을 표현하면 아래와 같습니다.  

mouse 동작에 따라서, down, up, move에 연결된 함수를 호출 하도록 합니다.  

 

4.2 Double buffering

 

마우스를 도형을 그릴 때, 화면의 깜박임을 없애기 위해서 아래와 같이 bufCanvas 객체를 사용합니다.

그리는 마우스가 움직임에 따라 업데이트해서 그려야하는 화면을 bufCtx에 미리 그린 후 

이 화면을 cvs에 복사하여, 깜박임을 제거 합니다.

var cvs;
var canvas;

var bufCanvas;
var bufCtx;


function onLoadPage() {
  canvas = document.getElementById("canvas");
  cvs = canvas.getContext("2d");

  bufCanvas = document.createElement("canvas");
  bufCanvas.width = canvas.width;
  bufCanvas.height = canvas.height;
  bufCtx = bufCanvas.getContext("2d");
}

 

4.3 선 그리기 구현

아래와 같이 직선을 그리는 동작을 구현 합니다.

function Painter() {
    this.shape = new Shape("Line");
    this.shape.mouseAction = new MouseAction(lineMouseUp, lineMouseDown, lineMouseMove);
}
function MouseAction(mouseUp, mouseDown, mouseMove) {
    this.up = mouseUp;
    this.down = mouseDown;
    this.move = mouseMove;
}

마우스를 클릭하면, 캔버스에서 마우스의 절대 좌표를 기억합니다.

그리고 현재 canvas의 그려진 이미지를 bufCtx에 복사해 둡니다.

function lineMouseDown(event) {
  if (painter.isDraw()) {
    return;
  }
  bufCtx.drawImage(canvas, 0, 0);
  var startPos = getMousePosition(event);
  painter.shape.point.x = startPos.X;
  painter.shape.point.y = startPos.Y;
  painter.setDrawMode(true);
}

마우스를 움직이면, 클릭했을 때 기억한 시작점부터, 현재의 마우스 위치로 직선을 그립니다.

clearRect() 함수를 불러주는 이슈는, delay()를 주기 위해서입니다.

원인은 모르겠으나, canvas가 제대로 업데이트 되지 않는 문제가 있어서 

clearRect() 함수를 한 번 호출해주어 약간의 delay()를 주어서 해결했습니다.

(원인을 아시분은 댓글로 지도 부탁드립니다. 굽신굽신;;)

function lineMouseMove(event) {
  if (!painter.isDraw()) {
    return;
  }
  
  var currentPos = getMousePosition(event);
  cvs.beginPath();
  // Need a delay
  cvs.clearRect(0, 0, canvas.width, canvas.height);
  cvs.drawImage(bufCanvas, 0, 0);

  cvs.strokeStyle = painter.shape.color;
  cvs.moveTo(painter.shape.point.x, painter.shape.point.y);
  cvs.lineTo(currentPos.X, currentPos.Y);
  cvs.closePath();
  cvs.stroke();
}

마우스가 캔버스를 벗어나거나, 버튼에서 손가락을 때면, 

bufCtx에 저장해둔 이미지 위에, 선을 그립니다.

그리고 그 bufCtx 이미지를 canvas에 덮어 씁니다.

function lineMouseUp(event) {
  if (!painter.isDraw()) {
    return;
  }

  var currentPos = getMousePosition(event);
  bufCtx.beginPath();
  bufCtx.strokeStyle = painter.shape.color;
  bufCtx.moveTo(painter.shape.point.x, painter.shape.point.y);
  bufCtx.lineTo(currentPos.X, currentPos.Y);
  bufCtx.closePath();
  bufCtx.stroke();
  cvs.drawImage(bufCanvas, 0, 0);

  painter.setDrawMode(false);
}

나머지 원, 네모, 세모도 동일한 원리로 구현 합니다.

여기까지 소스는 아래와 같습니다.

https://github.com/chobocho/painter/blob/master/doc/tutorial/004/src/painter.js

Posted by chobocho
Coding/JavsScript 삽질기2019. 11. 14. 09:43

 
경고  
  • 주인장은 자바스크립트 초보입니다.  
  • 자바스크립트 고수의 비급을 원하시는 분은 다른 자료를 참고 하시기 바랍니다.  
  • 과도한 기대는 과도한 실망을 가져옵니다.    
  • 본 강의는 자바스크립트만 사용합니다.  
  • 크롬에서의 동작만 보장 합니다.  
  • Canvas 기초 사용법은 구글링하시면 친절한 강의가 많습니다
 

3.1  painter.js 파일 생성  


먼저 javascript를 구현하기 위한, painter.js 파일을 만듭니다.  
 
 
 

3.2  기본설계  


painter app의 기본 자료형을 설계 합니다.  

위 내용을 UML로 표시하면 아래와 같습니다

위 UML을 코드로 구현하면 아래와 같습니다. 

 

맘에 드셨다면 공감 버튼 '꼭' 눌러주세요! 댓글과 질문은 늘 환영합니다.

Posted by chobocho
Coding/JavsScript 삽질기2019. 11. 13. 00:37

소개:  https://chobocho.tistory.com/2461396

실행하기: http://www.chobocho.com/javascript/painter.html

전체 소스코드: https://github.com/chobocho/painter


 

경고  

  • 주인장은 자바스크립트 초보입니다.  

  • 자바스크립트 고수의 비급을 원하시는 분은 다른 자료를 참고 하시기 바랍니다.  

  • 과도한 기대는 과도한 실망을 가져옵니다.    

  • 본 강의는 자바스크립트만 사용합니다.  

  • 크롬에서의 동작만 보장 합니다.  

 

 

[강의 001]( https://chobocho.tistory.com/2461414)에서 구상한 화면을 구현하면 아래와 같습니다.  

 

 

화면은 크게 3개의 DIV로 구성되어 있습니다.  

자세한 내용은 아래 코드를 참고 하시면 됩니다.  

 

https://github.com/chobocho/painter/tree/master/doc/tutorial/002/src

 

Posted by chobocho
Coding/JavsScript 삽질기2019. 11. 12. 09:20

https://github.com/chobocho/painter/blob/master/doc/tutorial/001/001.md


Javascript로 그림판 만들기 001
 
모든 프로그래밍의 시작은 요구사항 분석 입니다.
UML 툴을 이용하여 머릿속에 존재하는 그림판의 요구사항을 정리해 봅니다
 
 
요구사항이 정리 되었으면, 만들고자 하는 그림판의 모습을 먼저 그려 봅니다.
 
 
 

 

Posted by chobocho
Coding2019. 11. 8. 23:44

프로그래밍 중급(?) 수준에 이르기 위해서 보면 좋을 책을 내 마음 대로 정해 보았다.

재미로 읽어보시길 바랍니다.

좋은 책 있으시면 추천 부탁드립니다.

The C programming language 
The C++ programming language 
Refactoring 2/e
GoF의 디자인 패턴 
조엘 온 소프트웨어 
피플웨어 
생각하는 프로그래밍
실용주의 프로그래밍
테스트 주도 개발
CODE
Clean code
Clean coder
Clean software
Clean architecture
Effective java 3/e
Code complete 2
Head First Design Pattern
만들면서 배우는 인터프리터
컴파이러 구조와 원리
소프트웨어 장인
헤커의 기쁨 2/e
해커와 화가
맨먼스 미신

'Coding' 카테고리의 다른 글

내 마음대로 쓴 IT 신입사원이 알고 오면 좋은 것들  (0) 2020.03.16
웹페이지 스크랩  (0) 2006.05.08
[PHP]도서관리 스크립트  (0) 2006.01.16
Posted by chobocho
Coding/Python 삽질기2019. 11. 7. 02:03
Posted by chobocho
Coding/Python 삽질기2019. 10. 29. 01:29

getfilelist_TE1.zip
8.66MB

폴더안의 파일 목록을 보고 싶어서 간단한 툴을 만들어 보았다.

사용법:

파일 목록을 보고 싶은 폴더를 마우스로 드래그 & 드랍 하면 된다.

소스코드: https://github.com/chobocho/GetFileList

'Coding > Python 삽질기' 카테고리의 다른 글

Cornell Note (코넬 노트 앱)  (0) 2019.11.07
Pycon 2019 Korea youtube 링크 모음  (0) 2019.09.25
[Python] 파일 읽기  (0) 2019.06.20
Posted by chobocho
Coding/Python 삽질기2019. 9. 25. 00:03
제목
Link
100억건의 카카오톡 데이터로 똑똑한 일상대화 인공지능 만들기 - 김준성
고등학생이 직접 개발한 파이썬 프로젝트 사례 - 이준표 / 안우진 / 장민석 / 예두해 / 인상민
교육의 미래를 바꾸는 오늘의 파이써니스쿨 - 송석리
꼬마 모차르트가 되어보자(Feat. Magenta) - 김준우
뚱뚱하고 굼뜬 판다스(Pandas)를 위한 효과적인 다이어트 전략 - 오성우
리얼월드 메타클래스 - 김성현
법률을 디버깅하다(Debugging law) - 김재윤
셀러리 핵심과 커스터마이제이션 - 이지훈
시간 복잡도로 살펴보는 파이썬 내장 자료형의 효율적인 활용 - 강대성
실시간 의료 인공지능 데이터 처리를 위한 Django Query Optimization - 윤소영
엔터프라이즈급 네트워크 운용 관리 - 고득녕
오직 파이썬으로 이미지 인식 스피드런 - 최정현
온라인 뉴스 댓글은 정말 사람들의 목소리일까? - PART2 - 이준범
정적 타입 검사로 더 나은 Python 코드 작성하기 - 이창희
집에서 만든 머신러닝 기반 자동번역기 (NO 딥러닝) - 이홍주
추천시스템, 이제는 돈이 되어야 한다. - 최규민
코알못 직장인의 파이썬-아래한글 도전기 - 신명진
테스트에 걸리는 시간을 *92%* 줄이기 - 구영민
파이썬 3.7 어찌 그렇게 빨라졌나 - 정겨울
파이썬 웹서버 REST API 문서 쉽고 빠르게 작성하기 - 이용선
파이썬과 함께라면 못 할 것은 없다 - 반병현
파이썬으로 구현하는 최적화 알고리즘 - 차지원
파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥 - 한섬기
파이썬으로 해보는 화학실험 - 보일, 샤를의 법칙 - 신승우
파이썬의 변수 (강한 타입, Immutable vs Mutable, Class vs Instance) - 조인석
하나의 Django 코드로 여러 사이트 운영하기 - 박종현
하이퍼커넥트 Azar WebView Logging - 이준영/용현택
한국어 띄어쓰기 프로그램 도전기 - 최태균
Adapting from Spark to Dask: what to expect - Vaibhav Srivastav
Advanced Python testing techniques - 안재만
Build a Python IoT Image Classification solution - Dave Glover
from banksalad import python - 황성현
gRPC 와 python 을 활용한 Microservice 개발기 - 송지형
How did i get here? - Pradyun Gedam
Multitasking 환경을 상대하기 위한 DB의 특성과 그런 DB를 상대하기 위한 Django - 문석환
Pickle & Custom Binary Serializer - 김영석
py2exe를 구현하는 기술과 원리 - 이정훈
Python Daemonize: 파이썬으로 악마를 만들어보자 - 이수호
Python에서 DSL제작하기 - 하원호
Quantum Physics in Python: 파이썬으로 양자컴퓨팅 즐기기 - 최현수
Real world Graphene: lessons learned from building a GraphQL API - Marcin Gębala
Real-world asyncio - 김준기
Takeaways from my 5-year volunteering journey in the Python community-Alysson Alvaran
The Right Frameworks for the Right Time - Sean Ahn
The State of Python - Carol Willing
 

'Coding > Python 삽질기' 카테고리의 다른 글

[Python] 폴더 안의 파일 이름 추출 하기  (0) 2019.10.29
[Python] 파일 읽기  (0) 2019.06.20
email parser  (0) 2018.09.12
Posted by chobocho
Coding/Java 삽질기2019. 8. 30. 03:00
Posted by chobocho
Coding/Java 삽질기2019. 7. 16. 00:10
아래  경로의 파일을 연다
\incubating-netbeans-11.0-bin\netbeans\etc\netbeans.conf

그리고, 아래와 같이 netbeans_jdkhome 에 경로를 추가 해 준다.

 
 
Posted by chobocho