- 세상의 모든 계산기 자유(질문) 게시판 일반 ()
불티 움직임 시뮬레이션 (html5)
<!DOCTYPE html> <html> <head> <style> body { background: #1a1a1a; color: #fff; font-family: Arial, sans-serif; margin: 0; padding: 20px; display: flex; flex-direction: column; align-items: center; } canvas { background: #1a1a1a; border: 1px solid #333; margin: 20px 0; } .controls { background: rgba(0, 0, 0, 0.7); padding: 20px; border-radius: 10px; width: 380px; } .control-group { margin: 15px 0; } .control-group label { display: block; margin-bottom: 5px; color: #ffa500; } .slider-container { display: flex; align-items: center; gap: 10px; } input[type="range"] { flex: 1; height: 10px; -webkit-appearance: none; background: #333; border-radius: 5px; outline: none; } input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; background: #ffa500; border-radius: 50%; cursor: pointer; } .value-display { min-width: 50px; text-align: center; background: #333; padding: 5px; border-radius: 3px; } </style> </head> <body> <canvas id="sparkCanvas"></canvas> <div class="controls"> <div class="control-group"> <label>크기 배율 (Size Scale)</label> <div class="slider-container"> <input type="range" id="sizeScale" min="0.5" max="3" step="0.1" value="1"> <span class="value-display" id="sizeValue">1</span> </div> </div> <div class="control-group"> <label>온도 배율 (Temperature Scale)</label> <div class="slider-container"> <input type="range" id="tempScale" min="0.5" max="2" step="0.1" value="1"> <span class="value-display" id="tempValue">1</span> </div> </div> <div class="control-group"> <label>무게 배율 (Weight Scale)</label> <div class="slider-container"> <input type="range" id="weightScale" min="0.5" max="2" step="0.1" value="1"> <span class="value-display" id="weightValue">1</span> </div> </div> <div class="control-group"> <label>수명 배율 (Life Scale)</label> <div class="slider-container"> <input type="range" id="lifeScale" min="0.5" max="2" step="0.1" value="1"> <span class="value-display" id="lifeValue">1</span> </div> </div> </div> <script> const canvas = document.getElementById('sparkCanvas'); const ctx = canvas.getContext('2d'); // 캔버스 크기 설정 canvas.width = 400; canvas.height = 600; // 컨트롤 요소 const controls = { sizeScale: document.getElementById('sizeScale'), tempScale: document.getElementById('tempScale'), weightScale: document.getElementById('weightScale'), lifeScale: document.getElementById('lifeScale') }; // 값 표시 요소 const displays = { sizeValue: document.getElementById('sizeValue'), tempValue: document.getElementById('tempValue'), weightValue: document.getElementById('weightValue'), lifeValue: document.getElementById('lifeValue') }; // 컨트롤 값 업데이트 함수 Object.keys(controls).forEach(key => { controls[key].addEventListener('input', (e) => { displays[key.replace('Scale', 'Value')].textContent = e.target.value; }); }); class Spark { constructor() { this.reset(); } reset() { this.x = canvas.width/2 + (Math.random() * 40 - 20); this.y = canvas.height - 20; // 슬라이더 값을 반영한 특성 설정 this.baseSize = Math.random() * 3 + 1; this.size = this.baseSize * parseFloat(controls.sizeScale.value); this.baseTemp = Math.random() * 0.5 + 0.5; this.temperature = this.baseTemp * parseFloat(controls.tempScale.value); this.baseWeight = Math.random() * 0.3 + 0.1; this.weight = this.baseWeight * parseFloat(controls.weightScale.value); this.vx = 0; this.vy = -2 - (this.temperature * 2); this.baseLife = 1.0; this.life = this.baseLife * parseFloat(controls.lifeScale.value); this.color = `rgba(255, ${150 + Math.random() * 105}, 0, ${this.life})`; } update() { // 현재 슬라이더 값으로 특성 업데이트 this.size = this.baseSize * parseFloat(controls.sizeScale.value); this.temperature = this.baseTemp * parseFloat(controls.tempScale.value); this.weight = this.baseWeight * parseFloat(controls.weightScale.value); this.vx += Math.sin(Date.now() * 0.001) * 0.1 * this.weight; this.x += this.vx; this.y += this.vy * this.temperature; this.life -= 0.005 / parseFloat(controls.lifeScale.value); this.size *= 0.999; if (this.life <= 0 || this.y < 0 || this.x < 0 || this.x > canvas.width) { this.reset(); } this.color = `rgba(255, ${150 + Math.random() * 105}, 0, ${this.life})`; } draw() { ctx.beginPath(); ctx.fillStyle = this.color; ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); ctx.fill(); } } const sparks = Array(50).fill().map(() => new Spark()); function animate() { ctx.fillStyle = 'rgba(26, 26, 26, 0.2)'; ctx.fillRect(0, 0, canvas.width, canvas.height); sparks.forEach(spark => { spark.update(); spark.draw(); }); requestAnimationFrame(animate); } animate(); </script> </body> </html>
세상의모든계산기 님의 최근 댓글
fx-CG 의 경우 분모→A, 분자→B 로 저장해 풀어보면 fx-570 과 같이 A,B,C,D 로 나눠서 계산하면 결과는 둘 다 같음. 73.0495070585238 (15 digits) 같은 15digits 정밀도라도, 공학용 계산기에 따라 결과가 달라질 수 있는 건가? 입력 실수했나? - 어쨌건, TI-nspire 보다 정밀한 결과값 - 파이썬 시뮬레이터상 15 digits 값과 같진 않지만, 유사함. 2025 10.22 [공학용 계산기] 계산기 내부에서 사용하는 유효숫자 자릿수 Significant Digits https://allcalc.org/8848 2025 10.22 계산 정확도 (Internal Precision) 저게 맞나 싶은데요? 무슨 의미로 사용된 용어인지 검증이 필요한 듯 합니다. fx-570 ES PLUS 만 해도 내부 유효자릿수가 15-digits 입니다. https://allcalc.org/55918#comment_55944 2025 10.22 TI-nspire 로 동일하게 A, B, C, D 나누어 계산해 봐도... 한꺼번에 계산한 것과 똑같은 결과 "어? TI-nspire가 유효자릿수가 하나 적나?" 하고 1.234567890123456789 입력하고 Ans - 1.2345678 해 보니 내부 유효자릿수가 다르게 나오네요. TI-nspire 는 (십진수) 14-digits CASIO fx-570 ES 는 (십진수) 15-digits 둘 다 같다고 착각하고 있었나봅니다. 2025 10.22 카시오 fx-570 ES 로 계산하면? 카시오도 (십진수) 14digits 한계이므로, 비슷한 값이 나올 것으로 예상됨. 다만, stack 한계로 한번에 계산이 불가능하므로 부분을 나누어 계산 → A → B → C → D 최종 계산 결과에서 73.049507 을 빼면 fx-570 ES가 구한 결과값(Ans)은 73.0495070584404 (15digits) 로 최종 확인됨. - TI-Nspire 보다 오차가 작음. - 파이썬 시뮬레이션 15 digits 와는 차이가 있음. 2025 10.22