# data[].attributes.attachment_link.title
제목을-입력해주세요_

# data[].attributes.attachment_link.title
제목을 입력해주세요. (3)

# data[].attributes.attachment_link.title
제목을-입력해주세요_(11)

# data[].attributes.attachment_link.title
제목을-입력해주세요_(10)

# data[].attributes.attachment_link.title
제목을-입력해주세요_(2)

# data[].attributes.attachment_link.title
다 빈치 프로젝트 작품 결과 보고서의 사본

# data[].attributes.attachment_link.title
제목을-입력해주세요_

# data[].attributes.attachment_link.title
다 빈치 프로젝트 작품 결과 보고서의 사본

# data[].attributes.attachment_link.readable_text
import pygame, math, random, time, cv2, os
import numpy as np
import sounddevice as sd

# ---------------- ������ ----------------
W, H = 1280, 720
FADE_ALPHA = 20
FULLSCREEN = False
SHOW_FPS = True

# ������
COLOR_NATURE = np.array([80, 170, 255], dtype=float)   # ������(���������)
COLOR_NOISE  = np.array([255, 60, 60], dtype=float)    # ������ ������(���������)
BG_COLOR = (10, 15, 20)

# ��������� / ��������� ������������
MIC_SMOOTH = 0.85
MIC_GAIN = 12.0
MOTION_THRESHOLD = 20

# ���� ������ ��������� ������ ������
try:
    base_path = os.path.dirname(__file__)
    forest_path = os.path.join(base_path, "forest.jpg")
    forest_img = pygame.image.load(forest_path)
    forest_img = pygame.transform.scale(forest_img, (W, H))
    HAS_BG = True
    print("��� forest.jpg ������������ ������")
except Exception as e:
    print("������ forest.jpg ������������ ������:", e)
    HAS_BG = False

# ---------------- ��������� ----------------
class MicInput:
    def __init__(self):
        self.level = 0.0
        def callback(indata, frames, time_info, status):
            vol = float(np.linalg.norm(indata)) / len(indata)
            self.level = self.level * MIC_SMOOTH + vol * (1 - MIC_SMOOTH)
        self.stream = sd.InputStream(callback=callback, channels=1, samplerate=44100)
        self.stream.start()
    def get_level(self):
        return np.clip(self.level * MIC_GAIN, 0, 1)

# ---------------- ��������� ----------------
class MotionDetector:
    def __init__(self):
        self.cap = cv2.VideoCapture(0)
        self.prev = None
    def get_motion_level(self):
        ret, frame = self.cap.read()
        if not ret:
            return 0
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (9,9), 0)
        if self.prev is None:
            self.prev = gray
            return 0
        diff = cv2.absdiff(self.prev, gray)
        self.prev = gray
        motion = np.sum(diff > 30)
        return np.clip(motion / (W*H*0.05), 0, 1)
    def release(self):
        self.cap.release()

# ---------------- ������ ----------------
def sine_wave(x, phase, amp, freq):
    return math.sin(x * freq + phase) * amp

def noise_wave(x, t, amp, freq):
    return (random.random() - 0.5) * 2 * amp * math.sin(x * freq + t * 3)

def draw_wave(surface, level, motion, t):
    points = []
    # ���� ������
    amp = 40 + level * 250
    freq = 0.015 + 0.05 * level

    for x in range(W):
        base = H // 2 + sine_wave(x, t * 2, amp, freq)
        n = noise_wave(x, t, amp * 0.4 * (level + motion), freq * 1.2)
        y = base + n
        points.append((x, y))

    # ���� ������ ������ (level + motion ��� ��� ������)
    mix = np.clip(level + motion, 0, 1)
    color = (COLOR_NATURE * (1 - mix) + COLOR_NOISE * mix).astype(int)

    # ���� ������������������ ������ ������ (������ 6px)
    width = int(1 + mix * 5)

    # ��������� ������ ������ ��������� ������ (��������������� "���������������" ������)
    for w in range(width):
        offset = w - width / 2
        shifted = [(x, y + offset) for x, y in points]
        pygame.draw.aalines(surface, color, False, shifted)

# ---------------- ������ ������ ----------------
def main():
    pygame.init()
    flags = pygame.FULLSCREEN if FULLSCREEN else 0
    screen = pygame.display.set_mode((W, H), flags)
    clock = pygame.time.Clock()
    font = pygame.font.SysFont("consolas", 20)

    mic = MicInput()
    motion = MotionDetector()

    t = 0
    running = True
    while running:
        for e in pygame.event.get():
            if e.type == pygame.QUIT: running = False
            if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: running = False

        level = mic.get_level()
        motion_lvl = motion.get_motion_level()

        # ���� ������ ������
        if HAS_BG:
            img = forest_img.copy()
            gray_factor = min(1.0, level + motion_lvl)
            dark_factor = 1.0 - (level * 0.7)
            arr = pygame.surfarray.pixels3d(img)
            gray = np.dot(arr[..., :3], [0.3, 0.59, 0.11])[..., None]
            arr[:] = arr * (1 - gray_factor) + gray * gray_factor
            arr[:] = np.clip(arr * dark_factor, 0, 255)
            del arr
            screen.blit(img, (0, 0))
        else:
            screen.fill(BG_COLOR)

        # ��������� ������
        fade = pygame.Surface((W, H), pygame.SRCALPHA)
        fade.fill((0, 0, 0, FADE_ALPHA))
        screen.blit(fade, (0, 0))

        # ������
        draw_wave(screen, level, motion_lvl, t)
        t += 0.03 + level * 0.4

        # ��������� ������
        if level + motion_lvl > 0.7:
            glitch = pygame.Surface((W, H))
            glitch.blit(screen, (random.randint(-5, 5), random.randint(-5, 5)))
            glitch.set_alpha(80)
            screen.blit(glitch, (0, 0))

        # HUD
        if SHOW_FPS:
            txt = f"Mic:{level:.2f}  Motion:{motion_lvl:.2f}  FPS:{clock.get_fps():4.1f}"
            im = font.render(txt, True, (230, 230, 230))
            screen.blit(im, (20, 20))

        pygame.display.flip()
        clock.tick(60)

    motion.release()
    pygame.quit()

if __name__ == "__main__":
    main()

# data[].attributes.attachment_link.title
다 빈치 프로젝트 작품 결과 보고서의 사본

# data[].attributes.attachment_link.title
다 빈치 프로젝트 작품 결과 보고서 2팀

# data[].attributes.headline
결과 보고서 양식(파일 - 사본 만들기)

# data[].attributes.subject
결과 보고서 양식(파일 - 사본 만들기)

# data[].attributes.attachment_link.title
다 빈치 프로젝트 작품 결과 보고서

# data[].attributes.attachment_link.title
제목을-입력해주세요_ (1)

# data[].attributes.attachment_link.title
다 빈치 프로젝트 구상 2팀

# data[].attributes.attachment_link.title
다 빈치 프로젝트 구상의 사본

# data[].attributes.body
전재준 박지효 박서연 정유찬

# data[].attributes.attachment_link.title
다 빈치 프로젝트 구상의 사본

# data[].attributes.attachment_link.title
다 빈치 프로젝트 구상의 사본

# data[].attributes.attachment_link.title
구건율 김민서 김동은 프로젝트

# data[].attributes.headline
팀장이 사본만들기로 문서 공유해 갈 것.

# data[].attributes.subject
팀장이 사본만들기로 문서 공유해 갈 것.

# data[].attributes.attachment_link.title
다 빈치 프로젝트 구상

# data[].attributes.body
한 손을 들면 비가 내려 화면 곳곳에 작은 파동이 생긴다. 양손을 들면 큰 파동이 만들어져 천천히 번진다. 계속 잔잔한 물결이 퍼진다.

# data[].attributes.headline
파동을 점으로 바꾸어 점들이 시계방향으로

# data[].attributes.body
파동을 점으로 바꾸어 점들이 시계방향으로 회전하며, 색이 계속해서 바뀌게 만들었다.

# data[].attributes.body
여러가지 색이 점점 혼합되어 물결 파동이 일어나는 것을 표현하였다.

# data[].attributes.headline
손가락을 이용하여 움직이게 만들었고 색은

# data[].attributes.body
손가락을 이용하여 움직이게 만들었고 색은 무지개색으로 바뀌게끔 만들었다.

# data[].attributes.body
파동을 물에서 파도로 표현해서 몸을 움직임에 따라 파도가 생긴다

# data[].attributes.headline
파동의 색을 실제 오로라 색과 비슷하게 

# data[].attributes.body
파동의 색을 실제 오로라 색과 비슷하게 설정하였고, 일렁이는 효과를 주었다.

# data[].attributes.headline
배경에 별을 넣었고 파동의 색을 흰색으로

# data[].attributes.body
배경에 별을 넣었고 파동의 색을 흰색으로 바꿨다.

# data[].attributes.headline
손을 들었을때 여러가지 색으로 폭죽이 터

# data[].attributes.body
손을 들었을때 여러가지 색으로 폭죽이 터지게끔 만들었다

# data[].attributes.headline
무지개색 물결 파동을 만들었다.

# data[].attributes.body
무지개색 물결 파동을 만들었다.

# data[].attributes.headline
소리를 감지하면 캔버스의 상단 부분에서 

# data[].attributes.body
소리를 감지하면 캔버스의 상단 부분에서 불꽃놀이처럼 입자가 터지게 하였다.

# data[].attributes.headline
손을 들면 랜덤한 위치에서 랜덤한 색의 

# data[].attributes.body
손을 들면 랜덤한 위치에서 랜덤한 색의 폭죽이 여러개 터지도록 했다

# data[].attributes.body
소리의 크기에 따라 입자들이 무지개색으로 빠르게 변하며 화면에 퍼져나간다.
데시벨이 높을수록 입자가 더 밝고 멀리 확산되어 생동감 있게 움직인다.

# data[].attributes.headline
나를 인식하는 거랑 기본 입자를 없앴고 

# data[].attributes.body
나를 인식하는 거랑 기본 입자를 없앴고 터지는 입자를 폭죽처럼 선으로 바꿨다. 색도 흰색으로 바꾸었고 스페이스키를 누르면 한번에 3개씩 위치 상관없이 터지게 했다.

# data[].attributes.body
파티클을 무지개색으로 바꾸고, 0.5초마다 랜덤한 곳에서 파티클이 튀어나오게 바꾸었다.

# data[].attributes.body
배경을 밤하늘로 하고 마우스 클릭으로 한 번은 작게 두 번 클릭은 더 큰 불꽃을 터트리도록 하였다. 색깔을 여러가지로 하고 불꽃놀이 같은 모션으로 하였다

# data[].attributes.body
데시벨이 0.7이상이면 핑크색의 입자를 띄고, 0.7미만이면 노란색의 입자를 띈다.

# data[].attributes.headline
검지손가락 끝을 중심으로 그려지는 코드이

# data[].attributes.body
검지손가락 끝을 중심으로 그려지는 코드이다.
손을 움직이면 속도에 따라 리본의 폭과 굽은 정도가 바뀌며, 색도 천천히 무지개처럼 변한다.
손바닥을 완전히 펴면 그림이 모두 지워지고, M 키를 누르면 좌우로 브러쉬가 움직인다.

# data[].attributes.headline
검지로 선이 따라오게 하였고 선과 함께 

# data[].attributes.body
검지로 선이 따라오게 하였고 선과 함께 글자도 따라오게 하였다. 글자가 잔상에 남게 하였고, 무지개색 그라데이션을 주었다.

# data[].attributes.headline
손을 따라 움직이게 했고, 무지개 그라데

# data[].attributes.body
손을 따라 움직이게 했고, 무지개 그라데이션으로 바꿨다.

# data[].attributes.body
검지 손가락을 인식하는 카메라 파이썬 코드로 화난 고양이를 그려보았다.

# data[].attributes.body
선이 무지개 색이고 선 그릴 때마다 반짝이는 효과 하트나 별이 반짝임처럼 따라다니는 하트 그림

# data[].attributes.headline
선의 색을 무지개 그라데이션으로 만들고 

# data[].attributes.body
선의 색을 무지개 그라데이션으로 만들고 선이 그려질 때 맥동하는 효과를 넣었으며, 잔상이 사라지는 속도를 느리게 바꾸었다.

# data[].attributes.body
선을 파란색으로 바꾸고 손가락을 따라오게 만들었다. 튤립을 그렸다.

# data[].attributes.headline
몸이 아닌 검지로 따라오게 하였고 '바보

# data[].attributes.body
몸이 아닌 검지로 따라오게 하였고 '바보'라는 단어를 포인트에 써서 만들었다.

# data[].attributes.body
검지를 피면 그림이 그려지고, 주먹을 쥐었다 펴면 흰색-회색으로 색상이 전환되고, 브이를 하면 그림이 그려지지 않는다.

# data[].attributes.body
엄지로 그리면 색이 랜덤으로 지정

# data[].attributes.body
도라에몽, 파란색 하양색 빨간색을 추가하고 왼쪽 손은 그리기 오른쪽 손은 지우개 주먹은 멈추기

# data[].attributes.body
검지일 땐 보라색의 점들로 선이 그려지고 주먹을 쥐면 그려지지 않는다. 손을 다 폈을 때엔 지우개 모드가 되어 점이 하나씩 지워지고 브이 모양을 하면 캔버스 위 모든 점들이 지워진다.

# data[].attributes.body
검지를 피면 그림을 그리기 시작하고, 손가락을 5개 피면 최근에 찍혀진 점 순서대로 찍은 점을 지우기 시작함. 검지와 손가락 5개를 다 피는 걸 제외한 나머지 동작을 하면 그림 그리는 걸 멈춤

# data[].attributes.body
주먹을 쥐면 그리기를 멈추고 손을 피면 리셋된다.

# data[].attributes.body
by.김수현

검지를 펴면 그림이 그려지고 c키를 이용해 그림을 지울수 있으며, 오케이 사인을 하면 색상이 변경된다.

# data[].attributes.body
손가락을 펴면 그려지게 설정했고 주먹을 쥐면 그려지지 않게 코딩했다

# data[].attributes.body
오케이 사인을 하면 차례대로 11가지의 색상이 변하고, 주먹을 쥐면 그림 그리는 것이 멈추도록 하였습니다. 또한 검지를 폈을 때 색상을 칠 할 수 있도록 조정하였습니다

# data[].attributes.attachment_caption
주먹을 쥐면 그려지지 않고 검지를 피면 그려지게 코딩을 짰다.

# data[].attributes.body
중지로는 빨간색이 나오고 검지로는 노란색이 나오도록 코딩했다.

# data[].attributes.body
손바닥을 피면 그림이 그려지고 주먹을 쥐면 그림 그리는게 멈추며 주먹을 쥔 채로 뒤집으면 지워진다.

# data[].attributes.body
peace=파랑 open=초록 ok=노랑

주먹을 쥐면 멈추고 포즈에 따라 색이 바뀌도록 설정했다

# data[].attributes.attachment_caption
주먹은 지우개, 하나는 빨강, 이는 초록, 삼은 파랑

# data[].attributes.body
dows()