2단계 구현내용을 기반으로 태양계를 출력하는 프로그램을 구현한다.
2. 태양, 지구, 화성, 달을 생성하는 space 객체
3. 임의의 입력벋은 날짜의 위치로 각 객체를 이동시키는 date 객체
<form class="date__form">
<div class="date__result">
<span class="date__year">2022년</span>
<span class="date__month">01월</span>
<span class="date__day">01일</span>
<button class="date__form__btn">날짜받기</button>
</div>
</form>
<main class="space__main">
<div class="object" id="sun"></div>
<div class="orbit mars-orbit"></div>
<div class="mars-spin">
<div class="object" id="mars"></div>
</div>
<div class="orbit earth-orbit"></div>
<div class="earth-spin">
<div class="object" id="earth"></div>
<div class="orbit moon-orbit"></div>
<div class="moon-spin">
<div class="object" id="moon"></div>
</div>
</div>
</main>
// 2단계와 동일하며 화성이 추가 되었기에 화성의 css만 설명하겠다.
#mars {
position: absolute;
top: 0;
left: 50%;
height: 150px;
width: 150px;
margin-left: -75px;
margin-top: -75px;
border-radius: 50%;
}
.mars-orbit,
.mars-spin {
width: 900px;
height: 900px;
margin-left: -450px;
margin-top: -450px;
border-color: greenyellow;
}
// 3단계에서 화성이 추가되었다.
let space = { sun: [], earth: [], moon: [] };
// Sun, Earth, Moon, Mars의 지름 초기값을 입력 해준다.
space.init = function () {
let sunR = 7;
let earthR = 3;
let moonR = 1;
let marsR = 5; // Mars 추가
this.planetSize(sunR);
this.planetSize(earthR);
this.planetSize(moonR);
this.planetSize(marsR);
};
// 각 행성의 지름값으로 행성 생성에 필요한 정보를 가져온다.
space.planetSize = function (d) {
let dia = Number(d); // 지름
let radius = Math.floor(d / 2); // 반지름
let centerX = radius;
let centerY = radius;
if (dia === 7) {
this.makeSun(dia, radius, centerX, centerY);
} else if (dia === 5) {
// Mars 추가
this.makeMars(dia, radius, centerX, centerY);
} else if (dia === 3) {
this.makeEarth(dia, radius, centerX, centerY);
} else if (dia === 1) {
this.makeMoon(dia, radius, centerX, centerY);
}
};
// Mars 생성 함수
space.makeMars = function (d, r, x, y) {
this.mars = Array.from({ length: d }, () => Array(d));
for (let i = x - r; i <= x + r; i++) {
for (let j = y - r; j <= y + r; j++) {
if ((i - r) * (i - r) + (j - r) * (j - r) <= r * r) {
this.mars[i][j] = "☄️";
} else {
this.mars[i][j] = "";
}
}
}
this.showTheMars(d);
};
// Mars 호출 함수
space.showTheMars = function (d) {
for (let i = 0; i < d; i++) {
const div = document.createElement("div");
div.innerText = this.mars[i];
marsObject.appendChild(div);
}
};
date = {};
inputButton.addEventListener("click", date.getDateValue.bind(date));
// 1년 1월 1일부터 9999년 12월 31일까지 임의의 날짜를 입력 받는다.
date.getDateValue = function (event) {
event.preventDefault();
const selectYear = String(Math.floor(Math.random() * 9999 + 1));
const selectMonth = String(Math.floor(Math.random() * 12 + 1));
const selectDay = String(Math.floor(Math.random() * 31 + 1));
yearResult.innerText = `${selectYear.padStart(4, "0")}년`;
monthResult.innerText = `${selectMonth.padStart(2, "0")}월`;
dayResult.innerText = `${selectDay.padStart(2, "0")}일`;
this.calculateDate(selectYear, selectMonth, selectDay);
};
// 사용자가 입력한 date와 디폴트 date값을 초로 환산하여 일수의 차를 구한다.
date.calculateDate = function (year, mon, day) {
const yearNumber = Number(year);
const monthNumber = Number(mon);
const dayNumber = Number(day);
const defaultDate = Date.parse("2022 / 01 / 01");
const randomDate = Date.parse(
`${yearNumber} / ${monthNumber} / ${dayNumber}`
);
const onedayMs = 86400000; // 1 day는 86400000 밀리초다.
const movedDay = (randomDate - defaultDate) / onedayMs;
this.rotateObject(movedDay);
};
1day 밀리초 | 1day 지구 rotate deg | 1day 달 rotate deg | 1day 화성 rotate deg |
---|---|---|---|
86400000 | 0.98630137 | 13.33333 | 0.52401747 |
// "일" 수를 토대로 Earth와 Moon이 몇도 이동하는지 계산하고 이동시킨다.
date.rotateObject = function (day) {
const earthOrbit = document.querySelector(".earth-spin");
const moonOrbit = document.querySelector(".moon-spin");
const marsOrbit = document.querySelector(".mars-spin");
const earthOneDayDeg = 0.98630137; // 지구의 공전 주기 365일
const moonOneDayDeg = 13.33333; // 달의 공전 주기 27일
const marsOneDayDeg = 0.52401747; // 화성의 공전 주기 687일
const earthDeg = day * earthOneDayDeg;
const moonDeg = day * moonOneDayDeg;
const marsDeg = day * marsOneDayDeg;
earthOrbit.style.transform = `rotate(${earthDeg}deg)`;
moonOrbit.style.transform = `rotate(${moonDeg}deg)`;
marsOrbit.style.transform = `rotate(${marsDeg}deg)`;
};