// // Copyright (C) 2019, Maxim Lihachev, // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, version 3. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // // You should have received a copy of the GNU General Public License along with // this program. If not, see . // // ------------------------------------------------------------------------------ // Цвет воды const cWater = 'lightblue 0.4'; // Цвет бетона const cConcrete = 'gray 0.2'; // Толщина стенок var border = 20; // Отрисовка стрелок function drawArrow(x, y, direction) { if (direction === 'up' || direction === 'down') { const yy = direction === 'up' ? y + 10 : y - 10; stage.path().moveTo(x, y).lineTo(x + 4, yy); stage.path().moveTo(x, y).lineTo(x - 4, yy); } else { const xx = direction === 'left' ? x + 10 : x - 10; stage.path().moveTo(x, y).lineTo(xx, y + 4); stage.path().moveTo(x, y).lineTo(xx, y - 4); } } // Вывод размеров // [vertical|horizontal] X1, Y1, X2, Y2, размер function drawSize(direction, x1, y1, x2, y2, text, lsize = 0) { const label = stage.text(); label.text(text).fontSize(12); if (direction === 'vertical') { // Длина линии const xx = y2 - y1; // Длина выносных линий const line_size = lsize === 0 ? xx : lsize; console.log(line_size); // Позиция линии размера const arx1 = x1 + line_size * 0.7; stage.path().moveTo(x1, y1).lineTo(x1 + line_size, y1); stage.path().moveTo(x2, y2).lineTo(x2 + line_size, y2); stage.path().moveTo(arx1, y1).lineTo(arx1, y2); drawArrow(arx1, y1, 'up'); drawArrow(arx1, y2, 'down'); label.x(arx1 + 4); label.y(y1); label.y((y1 + xx / 2) - (label.getHeight() / 2)); } else { // Длина линии const xx = x2 - x1; // Длина выносных линий const line_size = lsize === 0 ? xx / 2.5 : lsize; console.log(line_size); // Позиция линии размера const ary1 = y1 + line_size * 0.7; stage.path().moveTo(x1, y1).lineTo(x1, y1 + line_size); stage.path().moveTo(x2, y2).lineTo(x2, y2 + line_size); stage.path().moveTo(x1, ary1).lineTo(x2, ary1); drawArrow(x1, ary1, 'left'); drawArrow(x2, ary1, 'right'); label.x(x1); label.y(ary1 + 5); label.x((x1 + xx / 2) - (label.getWidth() / 2)); } } // Квадратный бассейн, вид сверху // X, Y, подпись длины, длина, подпись ширины, ширина function drawRectanglePoolFromTop(x, y, lxx, xx, lyy, yy) { // // x1 xx x2 // y1 o------------------o----o-- // | | ^ // | | | // y | | | // y | | | // | | | // | | v // y2 o------------------o----o-- // | | // | | // o<---------------->o // | | // // Внешняя граница бассейна stage.rect(x, y, xx + border * 2, yy + border * 2).fill(cConcrete); const x1 = x + border; const x2 = x1 + xx; const y1 = y + border; const y2 = y1 + yy; // Бассейн stage.rect(x1, y1, xx, yy).fill(cWater); drawSize('vertical', x2, y1, x2, y2, lyy); drawSize('horizontal', x1, y2, x2, y2, lxx); } // Квадратный бассейн, вид сбоку // X, Y, подпись ширины, ширина, подпись глубины, глубина function drawRectanglePoolFromSide(x, y, lxx, xx, lyy, yy, lsize = 0) { // // x1 x2 x3 x4 // y1 o--o o--o // | | | | // | |~~~~~~~~~~~~| |----o-- // y | | | | ^ // y | | xx | | | // | o------------o | | // | x2 x3 | v // y2 o------------------o----o-- // | | // | | // o<---------->o // | | // // Внешняя граница бассейна const x1 = x; const x2 = x1 + border; const x3 = x2 + xx; const x4 = x3 + border; const y1 = y; const y2 = y1 + yy + border * 2; const b = border * 0.7; stage.path().moveTo(x1 - b, y1) .lineTo(x1, y1) .lineTo(x2, y1) .lineTo(x2, y2 - border) .lineTo(x3, y2 - border) .lineTo(x3, y1) .lineTo(x4, y1) .lineTo(x4 + b, y1) .lineTo(x4 + b, y1 + b) .lineTo(x4, y1 + b) .lineTo(x4, y2) .lineTo(x1, y2) .lineTo(x1, y1 + b) .lineTo(x1 - b, y1 + b) .lineTo(x1 - b, y1) .fill(cConcrete); // Бассейн stage.rect(x2, y1 + border, xx, yy).fill(cWater); drawSize('vertical', x3, y1 + border, x3, y2 - border, lyy); drawSize('horizontal', x2, y2 - border, x3, y2 - border, lxx, lsize); } // Круглый бассейн, вид сверху // X, Y, радиус function drawCirclePoolFromTop(x, y, dl, d) { // // _ _ _ // = = arx1 // = + + + = ----o-- // = + + = ^ // = + y + + = | // = + x + = v // = + + + = ----o-- // = = // ~ ~ ~ // // Радиус const xx = d / 2; // Внешняя граница бассейна stage.circle(x, y, xx + border).fill(cConcrete); // Бассейн stage.circle(x, y, xx).fill(cWater); // Размеры drawSize('vertical', x, y - xx, x, y + xx, dl, d); } // Круглый бассейн в двух проекциях // X, Y, диаметр, глубина function drawCirclePool(x, y, d, z) { let dd, zz; if ([d, z].some(e => e > 400)) { dd = d / 2; zz = z / 2; } else { dd = d; zz = z; } const x1 = x; const y1 = y; const x2 = x + dd * 1.5; const y2 = y * 0.75; // Толщина стенок border = dd * 0.11; drawCirclePoolFromTop(x1, y1, d, dd); drawRectanglePoolFromSide(x2, y2, d, dd, z, zz); } // Прямоугольный бассейн в двух проекциях // X, Y, длина, ширина, глубина function drawRectanglePool(x, y, xx, yy, zz) { let xx1, yy1, zz1; if ([xx, yy, zz].some(e => e > 400)) { xx1 = xx / 2; yy1 = yy / 2; zz1 = zz / 2; } else { xx1 = xx; yy1 = yy; zz1 = zz; } console.log('SIZES: ' + xx1 + ' x ' + yy1 + ' x ' + zz1); // Толщина стенок border = xx1 * 0.1; const x2 = (xx1 + yy1) * 1.2; const x3 = x2 * 2; drawRectanglePoolFromTop(x, y, xx, xx1, yy, yy1); drawRectanglePoolFromSide(x2, y, xx, xx1, zz, zz1); drawRectanglePoolFromSide(x3, y, yy, xx1, zz, zz1, yy * 0.8); } // Построение бассейна и вычисление стоимости по пользовательским данным function calc() { const x = Number(document.getElementById('x').value); const y = Number(document.getElementById('y').value); const z = Number(document.getElementById('z').value); const s = Number(document.getElementById('s').value); if ([x, y, z].some(e => e === 0)) { return; } // Объём параллелепипеда const result_square = x * y * z * s; // V=πr^2h const result_circle = Math.PI * Math.pow(x / 2, 2) * z * s; document.getElementById('result').innerHTML = ''; stage.removeChildren(); drawRectanglePool(10, 10, x, y, z); drawCirclePool(450, 450, x, z); } // ------------------------------------------------------------------------------ var stage = acgraph.create('stage-container'); drawRectanglePool(10, 10, 200, 100, 100); drawCirclePool(450, 450, 200, 100);