mirror of
https://github.com/UnickSoft/graphonline.git
synced 2025-07-01 15:26:12 +00:00
147 lines
5.0 KiB
JavaScript
147 lines
5.0 KiB
JavaScript
/**
|
|
* Graph drawer.
|
|
*/
|
|
|
|
// Vertex shape
|
|
const VertexCircleShape = 0,
|
|
VertexSquareShape = 1,
|
|
VertexTriangleShape = 2,
|
|
VertexPentagonShape = 3,
|
|
VertexHomeShape = 4,
|
|
VertexTextboxShape = 5;
|
|
VertexSnowflakeShape = 6;
|
|
|
|
function GetSquarePoints(diameter)
|
|
{
|
|
var res = [];
|
|
|
|
var a = diameter;
|
|
res.push(new Point(-a / 2, - a / 2));
|
|
res.push(new Point(a / 2, -a / 2));
|
|
res.push(new Point(a / 2, a / 2));
|
|
res.push(new Point(-a / 2, a / 2));
|
|
|
|
return res;
|
|
}
|
|
|
|
function GetTrianglePoints(diameter)
|
|
{
|
|
var res = [];
|
|
|
|
var effectiveDiameter = diameter * 1.5;
|
|
var upOffset = effectiveDiameter / 2;
|
|
var downOffset = effectiveDiameter / 4;
|
|
var lrOffset = effectiveDiameter * 3 / (Math.sqrt(3) * 4);
|
|
|
|
res.push(new Point(0, - upOffset));
|
|
res.push(new Point(lrOffset, downOffset));
|
|
res.push(new Point(- lrOffset, downOffset));
|
|
|
|
return res;
|
|
}
|
|
|
|
function GetPentagonPoints(diameter)
|
|
{
|
|
var res = [];
|
|
|
|
var baseValue = diameter / 2 * 1.2;
|
|
|
|
res.push(new Point(0, - baseValue));
|
|
res.push((new Point(0, - baseValue)).rotate(new Point(0, 0), 72));
|
|
res.push((new Point(0, - baseValue)).rotate(new Point(0, 0), 72 * 2));
|
|
res.push((new Point(0, - baseValue)).rotate(new Point(0, 0), 72 * 3));
|
|
res.push((new Point(0, - baseValue)).rotate(new Point(0, 0), 72 * 4));
|
|
res.push((new Point(0, - baseValue)).rotate(new Point(0, 0), 72 * 5));
|
|
|
|
return res;
|
|
}
|
|
|
|
function GetTextboxPoints(diameter, additional_data)
|
|
{
|
|
var res = [];
|
|
var width = diameter;
|
|
var height = diameter;
|
|
|
|
if (additional_data)
|
|
{
|
|
var tempContext = document.createElement('canvas').getContext('2d');
|
|
tempContext.font = "bold " + additional_data.style.mainTextFontSize +
|
|
DefaultFont;
|
|
let metrics = tempContext.measureText(additional_data.text);
|
|
width = metrics.width + diameter / 2;
|
|
let actualHeight = metrics.actualBoundingBoxAscent * 1.6;
|
|
height = Math.max(height, actualHeight);
|
|
}
|
|
|
|
res.push(new Point(-width / 2, -height / 2));
|
|
res.push(new Point(width / 2, -height / 2));
|
|
res.push(new Point(width / 2, height / 2));
|
|
res.push(new Point(-width / 2, height / 2));
|
|
|
|
return res;
|
|
}
|
|
|
|
function GetShowflakePoints(diameter)
|
|
{
|
|
var res = [];
|
|
|
|
var superSmallRadius = diameter * 0.8 / 2;
|
|
var smallRadius = diameter * 0.95 / 2;
|
|
var bigRadius = diameter * 1.5 / 2;
|
|
let angel = 8;
|
|
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), - angel));
|
|
res.push(new Point(smallRadius, 0));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), angel));
|
|
res.push(new Point(bigRadius, 0).rotate(new Point(0, 0), 30));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 - angel));
|
|
res.push(new Point(smallRadius, 0).rotate(new Point(0, 0), 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + angel));
|
|
res.push(new Point(bigRadius, 0).rotate(new Point(0, 0), 30 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 - angel));
|
|
res.push(new Point(smallRadius, 0).rotate(new Point(0, 0), 60 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 + angel));
|
|
res.push(new Point(bigRadius, 0).rotate(new Point(0, 0), 30 + 60 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 - angel));
|
|
res.push(new Point(smallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 + angel));
|
|
|
|
res.push(new Point(bigRadius, 0).rotate(new Point(0, 0), 30 + 60 + 60 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 + 60 - angel));
|
|
res.push(new Point(smallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 + 60 + angel));
|
|
res.push(new Point(bigRadius, 0).rotate(new Point(0, 0), 30 + 60 + 60 + 60 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 + 60 + 60 - angel));
|
|
res.push(new Point(smallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 + 60 + 60));
|
|
res.push(new Point(superSmallRadius, 0).rotate(new Point(0, 0), 60 + 60 + 60 + 60 + 60 + angel));
|
|
res.push(new Point(bigRadius, 0).rotate(new Point(0, 0), 30 + 60 + 60 + 60 + 60 + 60));
|
|
|
|
return res;
|
|
}
|
|
|
|
function GetPointsForShape(shape, diameter, additional_data=null)
|
|
{
|
|
switch (parseInt(shape))
|
|
{
|
|
case VertexSquareShape: return GetSquarePoints(diameter); break;
|
|
case VertexTriangleShape: return GetTrianglePoints(diameter); break;
|
|
case VertexPentagonShape: return GetPentagonPoints(diameter); break;
|
|
case VertexTextboxShape: return GetTextboxPoints(diameter, additional_data); break;
|
|
case VertexSnowflakeShape: return GetShowflakePoints(diameter); break;
|
|
default: return null; break;
|
|
}
|
|
}
|
|
|
|
function GetSizeForShape(shape, diameter)
|
|
{
|
|
switch (parseInt(shape))
|
|
{
|
|
case VertexSquareShape: return diameter; break;
|
|
case VertexTriangleShape: return diameter * 1.5; break;
|
|
case VertexPentagonShape: return diameter * 1.2; break;
|
|
case VertexTextboxShape: return diameter; break;
|
|
case VertexSnowflakeShape: return diameter * 1.5; break;
|
|
|
|
default: return diameter; break;
|
|
}
|
|
} |