찾기 VBA 함수

함수 =INDEX(B1:B2, MATCH(D1,A1:A2,0), 1)

용도: 셀 값을 비교하여 셀의 연결된 값을 호출해(찾아)준다.

예제) 철수의 번호 찾기

 


Match : 셀의 값이 서로 같은지 비교 함수

예제) Match 함수 

셀 A2와 셀C2의 값이 서로 같은지 비교하여 결과값을 보여준다.

Match( 찾을대상, 찾을 범위, 0 : 정확한 일치)


Index : 셀 지정

예제) Index (A1:A2, 1, 1)

A1:A2 는 선택 범위

1,1 은 선택범위 안에서 좌표이다.


알파벳 자동 생성

1) 셀에 65, 66, 67, ..... , 89,90 입력한다.

2) 함수 char() 를 사용하여 알파벳으로 변환한다.


숫자와 문자(텍스트) 조합

1) 각 셀에 숫자와 문자를 입력한다.

2) 함수 CONCATENATE를 이용하여 조합한다.

1. 사용 함수 

 

더보기

dx : X축 거리

dy : Y축 거리

np.hypot(dx, dy)


# 예제

import numpy as np       #np 함수를 사용하기 위해 필요하다.

 

print( np.hypot(1,1) )

 

점1 좌표 ( 0,1 ),  점2 좌표 ( 1,0 )

 

import numpy as np

 

print( np.hypot( (1-0),(0-1) )

 

출처: https://docs.scipy.org/doc/numpy/reference/generated/numpy.hypot.html


2. 사용 함수 

 

더보기

점1 좌표 (x1, y1), 점2 좌표 (x2, y2)

 

np.sqrt( (x2-x1)**2 + (y2-y1)**2 )

 


3. 응용(이용) 분야

 1) 게임에서 거리를 계산할 때 사용한다.

 2) 기계 가공 제품의 치수를 측정할 때 사용한다.

 

 

 

AnimateMotion


begin = "button.click"


<rect  style="cusor:pointer;"/>

<text > Click </text>


AnimateTranform


예제

 <circle

         cx="60.854164"

         cy="122.37499"

         r="13.349334" >

         <animateTransform

            attributeName="transform"

            begin="0s"

            dur="20s"

            type="rotate"

            from="0 60.854164 122.37499" /* 회전 중심은 원의 중심으로 했다. */

            to="360 60.854164 122.37499"

            repeatCount="indefinite"

        />

        </circle>


mpath


참고 : 

https://developer.mozilla.org/en-US/docs/Web/SVG/Element/animate


https://css-tricks.com/guide-svg-animations-smil/

http://blog.bilue.com.au/svg-animations-seriously-very-good/


https://codepen.io/netsi1964/pen/WxyYbj


https://css-tricks.com/almanac/properties/t/transform/



1축 이동

seesaw

spring

X, Y 방향으로 이동


X, Y 방향으로 이동: 자바스크립트 방식

회전



회전: 자바스크립트 방식

'소프트웨어 > website' 카테고리의 다른 글

티스토리에 mathjax 작동  (0) 2022.10.19
[자바스크립트] 테트리스 분석  (0) 2022.10.01
[자바 스크립트] 테트리스 분석  (0) 2022.10.01

1. 버튼 만들기

    구글 시트 화면에 버튼 그림을 넣는 작업이다.

    1) 구글 시트 상단 글자 메뉴: "삽입 - 그림" 클릭한다.

    2) 그림 창에서 tool 메뉴: "도형 - 도형 - 입체테두리"를 클릭한다.

    3) 그림 창 오른쪽 위에서 "저장 후 닫기"를 클릭한다.

   

구글 시트 메뉴
구글 시트 그림 편집 화면


   

2. 스크립트(Script) 작성

    버튼을 클릭하면 작동하는 메소드를 만드는 작업이다.

    1) 구글 시트 상단 글자 메뉴: 도구 - 스크립트 편집기

    2) 스크립트 편집 창에서 작동할 메소드를 만든다.

    3) 스크립트 편집 문법을 알아야 한다. 

 

스크립트 편집 화면


3. 스크립트 연결 

    버튼과 작동할 메소드를 연결한다.

    1) 구글 시트 위에 있는 그림 위 오른쪽 상단 메뉴에서 "스크립트 할당"을 선택한다.

    2) 메소드명을 입력한다. 위 화면 메소드는 "myFunction"이다.

 


4. 버튼을 눌러 실행시키기

   버튼을 누르면 구글에서 보안 때문에 메세지가 뜬다. "고급"을 클릭해서 보안 경고를 건너뛴다.

결과 화면

#스크립트 참고 사이트

https://helpdeskgeek.com/office-tips/5-google-sheets-script-functions-you-need-to-know/

테트리스 소스코드 출처:http://zetcode.com/wxpython/thetetrisgame/

 

클래스 

Tetris, Board, Tetrinomoes, Shape

 

리스트

board, : 보드 리스트

coordsTable, : 모든 Shape 리스트

coords : 한개 Shape 리스트

 

변수

self.isWaitingAfterLine : 블록이 최초 생성인지 확인하기 위한 것

 

화면 그리기

블록(piece) 하나 그리기, 블록 쌓인 것 그리기

 

기능 :          

블록 하나 생성, 블록회전, 이동충돌검사, 채워짐 검사 세팅, 블록 제거 세팅, 보드 상단 접촉 검사

 

배열 :          

보드 초기화, 보드 블록 유무 세팅,  블록 이동 보드 배열 값 수정

키 눌러짐 검사 

반복 실행(작업)


 

 

프로그램 최초 시작

app = wx.App()
Tetris(None, title='Tetris')
app.MainLoop()

블록 쌓인 것 그리기, 블록 하나 그리기, 블록 이동

방법: 배열 값에 따라 전 화면을 다시 그려준다.


블록 쌓인 것 그리기

블록 전체(쌓인부분, 빈공간)를 그린다.


        for i in range(Board.BoardHeight):
            for j in range(Board.BoardWidth):
                shape = self.shapeAt(j, Board.BoardHeight - i - 1)
                if shape != Tetrominoes.NoShape:
                    self.drawSquare(dc,
                        0 + j * self.squareWidth(),
                        boardTop + i * self.squareHeight(), shape)
for문 설명:

블록 하나 그리기, 블록 이동

블록 하나를 빈공간에 그린다. 블록이 이동하는 것처럼 보인다.

if self.curPiece.shape() != Tetrominoes.NoShape:
            for i in range(4):
                x = self.curX + self.curPiece.x(i)
                y = self.curY - self.curPiece.y(i)
                self.drawSquare(dc, 0 + x * self.squareWidth(),
                    boardTop + (Board.BoardHeight - y - 1) * self.squareHeight(),
                    self.curPiece.shape())

블록 이동 좌표 수정

X,Y 좌표를 수정한다.

self.curY-1 : 좌표 값을 줄이면 위치가 바뀐다.

self.tryMove(self.curPiece, self.curX, self.curY - 1):

    def tryMove(self, newPiece, newX, newY):
        
        for i in range(4):
            
            x = newX + newPiece.x(i)
            y = newY - newPiece.y(i)
            
            if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight:
                return False
            if self.shapeAt(x, y) != Tetrominoes.NoShape:
                return False
        
        self.curPiece = newPiece
        self.curX = newX     변한 좌표 값을 전달 받는 곳
        self.curY = newY
        self.Refresh()
        
        return True

 


블록 이동 보드 배열 수정

 def pieceDropped(self):

        

        for i in range(4):

            x = self.curX + self.curPiece.x(i)

            y = self.curY - self.curPiece.y(i)

            self.setShapeAt(x, y, self.curPiece.shape())

 

        self.removeFullLines()


블록 하나 생성

self.nextPiece.setRandomShape()


블록 회전

회전 수학 공식 : https://ilvjesuscoding.tistory.com/73?category=708594

def rotatedLeft(self):

        

        if self.pieceShape == Tetrominoes.SquareShape:

            return self

 

        result = Shape()

        result.pieceShape = self.pieceShape

        

        for i in range(4):

            result.setX(i, self.y(i))

            result.setY(i, -self.x(i))

 

        return result

 

    def rotatedRight(self):

        

        if self.pieceShape == Tetrominoes.SquareShape:

            return self

 

        result = Shape()

        result.pieceShape = self.pieceShape

        

        for i in range(4):

            result.setX(i, -self.y(i))

            result.setY(i, self.x(i))

 

        return result


블록 이동, 충돌 검사 (벽)

좌표 값을 비교한다.

self.tryMove(self.curPiece, self.curX - 1, self.curY)
if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight:
                return False
if self.shapeAt(x, y) != Tetrominoes.NoShape:
                return False

 


블록 보드 상단 접촉 검사 : 블록이 더이상 내려갈 수 없는지 검사

 

if not self.tryMove(self.curPiece, self.curX, self.curY):

            

            self.curPiece.setShape(Tetrominoes.NoShape)

            self.timer.Stop()

            self.isStarted = False

            statusbar.SetStatusText('Game over')

 

 

보드 블록 유무 세팅
배열 값을 수정한다.

 

shape = self.shapeAt(j, Board.BoardHeight - i - 1)

보드 블록 초기화
self.board = []
self.clearBoard()

블록 한줄 채워짐 검사
배열 값을 비교한다. 그리고 총 갯수를 센다.
for i in range(Board.BoardHeight):
            n = 0
            for j in range(Board.BoardWidth):
                if not self.shapeAt(j, i) == Tetrominoes.NoShape:
                    n = n + 1

            if n == 10:
                rowsToRemove.append(i)        

블록 제거 세팅

방법: 배열 값을 바꾼다.

        rowsToRemove.reverse()

for m in rowsToRemove: for k in range(m, Board.BoardHeight): for l in range(Board.BoardWidth): self.setShapeAt(l, k, self.shapeAt(l, k + 1))


키 눌러짐 검사

self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

 

def OnKeyDown(self, event):

        

        if not self.isStarted or self.curPiece.shape() == Tetrominoes.NoShape:

            event.Skip()

            return

 

        keycode = event.GetKeyCode()

 

        if keycode == ord('P') or keycode == ord('p'):

            self.pause()

            return

        if self.isPaused:

            return

        elif keycode == ord('J') or keycode == ord('j'):

            self.tryMove(self.curPiece, self.curX - 1, self.curY)

        elif keycode == ord('L') or keycode == ord('l'):

            self.tryMove(self.curPiece, self.curX + 1, self.curY)

        elif keycode == wx.WXK_DOWN:

            self.tryMove(self.curPiece.rotatedRight(), self.curX, self.curY)

        elif keycode == ord('I') or keycode == ord('i'):

            self.tryMove(self.curPiece.rotatedLeft(), self.curX, self.curY)

        elif keycode == wx.WXK_SPACE:

            self.dropDown()

        elif keycode == ord('D') or keycode == ord('d'):

            self.oneLineDown()

        else:

            event.Skip()


반복 실행 : 블록이 계속해서(반복해서) 그려지고 떨어지는 작업

self.Bind(wx.EVT_TIMER, self.OnTimer, id=Board.ID_TIMER)

 

def OnTimer(self, event):

        

        if event.GetId() == Board.ID_TIMER:

            if self.isWaitingAfterLine:

                self.isWaitingAfterLine = False

                self.newPiece()

            else:

                self.oneLineDown()

        else:

            event.Skip()

 

 

 

 

작동 순서( work sequence)

파이썬 matplotlib를 사용하여, CSV 파일에서 좌표 데이터를 읽은 후 차트를 모니터에그린다.

실행결과 화면( work result)

준비물(Supplies)

  • CSV file : 저장 양식(format) x,z 좌표 값

  • 파이썬(python) matplotlib

소스코드(Source code)

 

 

+ Recent posts