<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nbittrpgwiki.pynappo.xyz/index.php?action=history&amp;feed=atom&amp;title=Module%3ARadarGraph</id>
	<title>Module:RadarGraph - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nbittrpgwiki.pynappo.xyz/index.php?action=history&amp;feed=atom&amp;title=Module%3ARadarGraph"/>
	<link rel="alternate" type="text/html" href="https://nbittrpgwiki.pynappo.xyz/index.php?title=Module:RadarGraph&amp;action=history"/>
	<updated>2026-10-25T13:39:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://nbittrpgwiki.pynappo.xyz/index.php?title=Module:RadarGraph&amp;diff=3250&amp;oldid=prev</id>
		<title>CStatic: Created page with &quot;local a = require(&#039;Module:ACandy&#039;).a local getArgs = require(&#039;Module:Arguments&#039;).getArgs  local p = {}  local function deg2rad(d) return d * math.pi / 180 end  local function makeRings(max) 	local step = 50 / max 	local parts = {} 	for i = 1, max do 		local pct = i * step 		local style = &quot;radial-gradient(circle at center, rgba(127,127,127,0.1) %.2f%%, rgba(0,0,0,0) %.2f%%)&quot; 		table.insert(parts, string.format(style, pct-0.3, pct+0.3)) 	end 	return table.concat(parts, &quot;,&quot;...&quot;</title>
		<link rel="alternate" type="text/html" href="https://nbittrpgwiki.pynappo.xyz/index.php?title=Module:RadarGraph&amp;diff=3250&amp;oldid=prev"/>
		<updated>2026-10-05T00:25:24Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local a = require(&amp;#039;Module:ACandy&amp;#039;).a local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs  local p = {}  local function deg2rad(d) return d * math.pi / 180 end  local function makeRings(max) 	local step = 50 / max 	local parts = {} 	for i = 1, max do 		local pct = i * step 		local style = &amp;quot;radial-gradient(circle at center, rgba(127,127,127,0.1) %.2f%%, rgba(0,0,0,0) %.2f%%)&amp;quot; 		table.insert(parts, string.format(style, pct-0.3, pct+0.3)) 	end 	return table.concat(parts, &amp;quot;,&amp;quot;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local a = require(&amp;#039;Module:ACandy&amp;#039;).a&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function deg2rad(d) return d * math.pi / 180 end&lt;br /&gt;
&lt;br /&gt;
local function makeRings(max)&lt;br /&gt;
	local step = 50 / max&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for i = 1, max do&lt;br /&gt;
		local pct = i * step&lt;br /&gt;
		local style = &amp;quot;radial-gradient(circle at center, rgba(127,127,127,0.1) %.2f%%, rgba(0,0,0,0) %.2f%%)&amp;quot;&lt;br /&gt;
		table.insert(parts, string.format(style, pct-0.3, pct+0.3))&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(parts, &amp;quot;,&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame, {removeBlanks = true})&lt;br /&gt;
	local maxValue = tonumber(args.max) or 5&lt;br /&gt;
	local width = args.width or &amp;quot;500px&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local names, values = {}, {}&lt;br /&gt;
	for _, arg in ipairs(args) do&lt;br /&gt;
		local i, _ = string.find(arg, &amp;quot;::&amp;quot;);&lt;br /&gt;
		local key, value;&lt;br /&gt;
		if i then&lt;br /&gt;
		    key = string.sub(arg, 1, i - 1);&lt;br /&gt;
		    value = string.sub(arg, i + 2);&lt;br /&gt;
			local num = tonumber(value)&lt;br /&gt;
			if num then&lt;br /&gt;
				table.insert(names, key)&lt;br /&gt;
				table.insert(values, num)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local n = #names&lt;br /&gt;
	if n &amp;lt; 3 then&lt;br /&gt;
		return &amp;#039;Error: Need at least 3 axes.&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local maxR, center = 35, 50 -- percentages&lt;br /&gt;
	local points, markers, labels, spokes = {}, {}, {}, {}&lt;br /&gt;
&lt;br /&gt;
	for i=1,n do&lt;br /&gt;
		-- Ensure there is always one angled to point to the top&lt;br /&gt;
		local angle = - 90 - (i-1) * (360/n)&lt;br /&gt;
		local r = (values[i] / maxValue) * maxR&lt;br /&gt;
		local x = center + r * math.cos(deg2rad(angle))&lt;br /&gt;
		local y = center + r * math.sin(deg2rad(angle))&lt;br /&gt;
		table.insert(points, string.format(&amp;#039;%.3f%% %.3f%%&amp;#039;, x, y))&lt;br /&gt;
&lt;br /&gt;
		-- marker&lt;br /&gt;
		table.insert(markers, a.div {&lt;br /&gt;
			style = string.format(&lt;br /&gt;
				&amp;#039;position:absolute;left:%.3f%%;top:%.3f%%;&amp;#039; ..&lt;br /&gt;
				&amp;#039;width:2%%;height:2%%;margin:-1%% 0 0 -1%%;&amp;#039; ..&lt;br /&gt;
				&amp;#039;border-radius:50%%;background:#377dff;border:0.6%% solid #fff&amp;#039;,&lt;br /&gt;
				x, y&lt;br /&gt;
			)&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		-- label (slightly beyond maxR)&lt;br /&gt;
		-- X-axis needs to be further away since text spans horizontally&lt;br /&gt;
		local lx = center + maxR * 1.3 * math.cos(deg2rad(angle))&lt;br /&gt;
		local ly = center + maxR * 1.2 * math.sin(deg2rad(angle))&lt;br /&gt;
		table.insert(labels, a.div {&lt;br /&gt;
			style = string.format(&lt;br /&gt;
				&amp;#039;position:absolute;left:%.3f%%;top:%.3f%%;&amp;#039; ..&lt;br /&gt;
				&amp;#039;transform:translate(-50%%,-50%%);&amp;#039; ..&lt;br /&gt;
				&amp;#039;font-size: larger;&amp;#039; ..&lt;br /&gt;
				&amp;#039;z-index: 1&amp;#039;,&lt;br /&gt;
				lx, ly&lt;br /&gt;
			),&lt;br /&gt;
			names[i]&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		-- spoke&lt;br /&gt;
		table.insert(spokes, a.div {&lt;br /&gt;
			style = string.format(&lt;br /&gt;
				&amp;#039;position:absolute;left:50%%;top:50%%;&amp;#039; ..&lt;br /&gt;
				&amp;#039;width:0.6%%;height:%d%%;background:#7777774d;&amp;#039; ..&lt;br /&gt;
				&amp;#039;transform-origin:50%% 0%%;transform:translateX(-50%%) rotate(%.1fdeg);&amp;#039;,&lt;br /&gt;
				maxR, - angle + 90&lt;br /&gt;
			)&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- polygon fill&lt;br /&gt;
	local poly = a.div {&lt;br /&gt;
		style = string.format(&lt;br /&gt;
			&amp;#039;position:absolute;left:0;top:0;width:100%%;height:100%%;&amp;#039; ..&lt;br /&gt;
			&amp;#039;clip-path:polygon(%s);&amp;#039; ..&lt;br /&gt;
			&amp;#039;background:linear-gradient(135deg,rgba(55,125,255,0.28),rgba(55,125,255,0.18));&amp;#039; ..&lt;br /&gt;
			&amp;#039;border:0.6%% solid rgba(55,125,255,0.5);border-radius:2%%;&amp;#039;,&lt;br /&gt;
			table.concat(points, &amp;#039;,&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local rings = makeRings(maxValue);&lt;br /&gt;
&lt;br /&gt;
	return a.div {&lt;br /&gt;
		style = string.format(&lt;br /&gt;
			&amp;#039;width:%s;max-width:100%%;position:relative;&amp;#039; ..&lt;br /&gt;
			&amp;#039;aspect-ratio : 1 / 1;&amp;#039; ..&lt;br /&gt;
			&amp;#039;background: %s; &amp;#039; ..&lt;br /&gt;
			&amp;#039;border-radius:2%%;box-shadow:0 0.3%% 0.6%% rgba(0,0,0,0.06);&amp;#039;,&lt;br /&gt;
			width, rings&lt;br /&gt;
		),&lt;br /&gt;
		-- center dot&lt;br /&gt;
		a.div { style = &amp;#039;position:absolute;left:50%;top:50%;width:1.8%;height:1.8%;margin:-0.9% 0 0 -0.9%;border-radius:50%;background:#666;opacity:0.8&amp;#039; },&lt;br /&gt;
		-- spokes, labels, polygon, markers&lt;br /&gt;
		spokes,&lt;br /&gt;
		labels,&lt;br /&gt;
		poly,&lt;br /&gt;
		markers&lt;br /&gt;
	};&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>CStatic</name></author>
	</entry>
</feed>