You've already forked ComfyFactorio
							
							
				mirror of
				https://github.com/ComfyFactory/ComfyFactorio.git
				synced 2025-10-30 23:47:41 +02:00 
			
		
		
		
	utils/math pt2
This commit is contained in:
		| @@ -8,6 +8,7 @@ require 'utils.server' | ||||
| require 'utils.server_commands' | ||||
| require 'utils.command_handler' | ||||
| require 'utils.utils' | ||||
| require 'utils.math.math' | ||||
| require 'utils.pause_game' | ||||
| require 'utils.table' | ||||
| require 'utils.whisper_notice' | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| -- This file is part of thesixthroc's Pirate Ship softmod, licensed under GPLv3 and stored at https://github.com/ComfyFactory/ComfyFactorio and https://github.com/danielmartin0/ComfyFactorio-Pirates. | ||||
|  | ||||
| local Geometry = require 'utils.math.geometry' | ||||
|  | ||||
| local Public = {} | ||||
|  | ||||
| Public.random = math.random | ||||
| @@ -164,18 +166,15 @@ function Public.shuffle(tbl) | ||||
|     return tbl | ||||
| end | ||||
|  | ||||
| local function is_closer(pos1, pos2, pos) | ||||
|     return ((pos1.x - pos.x) ^ 2 + (pos1.y - pos.y) ^ 2) < ((pos2.x - pos.x) ^ 2 + (pos2.y - pos.y) ^ 2) | ||||
| end | ||||
| function Public.shuffle_distancebiased(tbl, position) | ||||
|     local size = #tbl | ||||
|     for i = size, 1, -1 do | ||||
|         local rand = Public.random(i) | ||||
|         if is_closer(tbl[i].position, tbl[rand].position, position) and i > rand then | ||||
|             tbl[i], tbl[rand] = tbl[rand], tbl[i] | ||||
|         end | ||||
|     end | ||||
|     return tbl | ||||
| 	local size = #tbl | ||||
| 	for i = size, 1, -1 do | ||||
| 		local rand = Public.random(i) | ||||
| 		if Geometry.is_closer(position, tbl[i].position, tbl[rand].position) and i > rand then | ||||
| 			tbl[i], tbl[rand] = tbl[rand], tbl[i] | ||||
| 		end | ||||
| 	end | ||||
| 	return tbl | ||||
| end | ||||
|  | ||||
| Public.points_in_m20t20_squared_sorted_by_distance_to_origin = { | ||||
|   | ||||
| @@ -23,13 +23,6 @@ local ticks_to_hours = 1 / hours_to_ticks | ||||
| -- local vars | ||||
| local Public = {} | ||||
|  | ||||
| --- Measures distance between pos1 and pos2 | ||||
| function Public.distance(pos1, pos2) | ||||
|     local dx = pos2.x - pos1.x | ||||
|     local dy = pos2.y - pos1.y | ||||
|     return sqrt(dx * dx + dy * dy) | ||||
| end | ||||
|  | ||||
| --- Takes msg and prints it to all players except provided player | ||||
| -- @param msg <string|table> table if locale is used | ||||
| -- @param player <LuaPlayer> the player not to send the message to | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| local Math = require 'utils.math.math' | ||||
| --[[ | ||||
| roll(budget, max_slots, blacklist) returns a table with item-stacks | ||||
| budget		-	the total value of the item stacks combined | ||||
| @@ -535,7 +536,7 @@ function Public.get_tech_blacklist(tier) | ||||
|  | ||||
|     local blacklist = {} | ||||
|     local size_of_tech_tier_list = #tech_tier_list | ||||
|     tier = math.clamp(tier, 0, 1) | ||||
|     tier = Math.clamp(tier, 0, 1) | ||||
|     local min_index = math_floor(size_of_tech_tier_list * tier) + 1 | ||||
|     for i = size_of_tech_tier_list, min_index, -1 do | ||||
|         blacklist[tech_tier_list[i]] = true | ||||
|   | ||||
| @@ -5,7 +5,7 @@ local Server = require 'utils.server' | ||||
| local session = require 'utils.datastore.session_data' | ||||
| local Config = require 'utils.gui.config' | ||||
| local SpamProtection = require 'utils.spam_protection' | ||||
|  | ||||
| local Math = require 'utils.math.math' | ||||
| local Public = {} | ||||
|  | ||||
| local insert = table.insert | ||||
| @@ -274,7 +274,7 @@ local function update_poll_viewer(data) | ||||
|     if #polls == 0 then | ||||
|         poll_index = 0 | ||||
|     else | ||||
|         poll_index = math.clamp(poll_index, 1, #polls) | ||||
|         poll_index = Math.clamp(poll_index, 1, #polls) | ||||
|     end | ||||
|  | ||||
|     data.poll_index = poll_index | ||||
|   | ||||
| @@ -67,4 +67,9 @@ function Public.vector_norm(vec) | ||||
| 	return { x = vec_copy.x, y = vec_copy.y } | ||||
| end | ||||
|  | ||||
| --- Returns true if position is closer to pos1 than to pos2 | ||||
| function Public.is_closer(position, pos1, pos2) | ||||
| 	return Public.vector_distance(pos1, position) < Public.vector_distance(pos2, position) | ||||
| end | ||||
|  | ||||
| return Public | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| ---@diagnostic disable: undefined-field | ||||
| --luacheck: globals table | ||||
| local Stats = require 'utils.math.stats' | ||||
| local Utils = require 'utils.utils' | ||||
| local Geometry = require 'utils.math.geometry' | ||||
| local random = math.random | ||||
| local floor = math.floor | ||||
| local remove = table.remove | ||||
| @@ -169,52 +169,6 @@ function table.get_random_weighted(weighted_table, item_index, weight_index) | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| ---Returns one random value based on the supplied weights. Form {[a] = A, [b] = B, ...} and {[a] = a_weight, [b] = b_weight, ...} or just {a,b,c,...} and {1,2,1,...}. | ||||
| ---Both tables have to be the same size. | ||||
| ---@param values table | ||||
| ---@param weights table | ||||
| ---@return any | ||||
| function table.get_random_weighted_t(values, weights) | ||||
|     local total_weight = 0 | ||||
|     for k, w in pairs(weights) do | ||||
|         assert(values[k], 'Weighted_raffle: A weight is missing value!') | ||||
|         if w > 0 then | ||||
|             -- negative weights treated as zero | ||||
|             total_weight = total_weight + w | ||||
|         end | ||||
|     end | ||||
|     assert(total_weight > 0, 'Total weight of weighted_raffle needs to be bigger than zero!') | ||||
|  | ||||
|     local cumulative_probability = 0 | ||||
|     local rng = random() | ||||
|     for k, v in pairs(values) do | ||||
|         assert(weights[k], 'Weighted_raffle: A value is missing weight!') | ||||
|         cumulative_probability = cumulative_probability + (weights[k] / total_weight) | ||||
|         if rng <= cumulative_probability then | ||||
|             return v | ||||
|         end | ||||
|     end | ||||
| end | ||||
|  | ||||
|  | ||||
| ---Returns a table with % chance values for each item of a weighted_table | ||||
| ---@param weighted_table table of tables with items and their weights | ||||
| ---@param weight_index number of the index of the weights, defaults to 2 | ||||
| ---@return table | ||||
| function table.get_random_weighted_chances(weighted_table, weight_index) | ||||
|     local total_weight = 0 | ||||
|     weight_index = weight_index or 2 | ||||
|     for _, v in pairs(weighted_table) do | ||||
|         total_weight = total_weight + v[weight_index] | ||||
|     end | ||||
|     local chance_table = {} | ||||
|     for k, v in pairs(weighted_table) do | ||||
|         chance_table[k] = v[weight_index] / total_weight | ||||
|     end | ||||
|     return chance_table | ||||
| end | ||||
|  | ||||
| ---Creates a fisher-yates shuffle of a sequential number-indexed table. | ||||
| ---Because this uses math.random, it cannot be used outside of events if no rng is supplied | ||||
| ---from: http://www.sdknews.com/cross-platform/corona/tutorial-how-to-shuffle-table-items | ||||
| @@ -248,7 +202,7 @@ function table.shuffle_by_distance(tbl, position) | ||||
|     local size = #tbl | ||||
|     for i = size, 1, -1 do | ||||
|         local rand = random(size) | ||||
|         if Utils.is_closer(pos(tbl[i]), pos(tbl[rand]), position) and i > rand then | ||||
|         if Geometry.is_closer(pos(tbl[i]), pos(tbl[rand]), position) and i > rand then | ||||
|             tbl[i], tbl[rand] = tbl[rand], tbl[i] | ||||
|         end | ||||
|     end | ||||
|   | ||||
| @@ -1,55 +1,5 @@ | ||||
| local Module = {} | ||||
|  | ||||
| ---Returns cartesian distance between pos1 and pos2 | ||||
| ---@param pos1 MapPosition|{x:double,y:double} | ||||
| ---@param pos2 MapPosition|{x:double,y:double} | ||||
| ---@return number | ||||
| function Module.distance(pos1, pos2) | ||||
|     local dx = pos2.x - pos1.x | ||||
|     local dy = pos2.y - pos1.y | ||||
|     return math.sqrt(dx * dx + dy * dy) | ||||
| end | ||||
|  | ||||
| ---Returns true if position is closer to pos1 than to pos2 | ||||
| ---@param pos1 MapPosition|{x:double,y:double} | ||||
| ---@param pos2 MapPosition|{x:double,y:double} | ||||
| ---@param position MapPosition|{x:double,y:double} | ||||
| ---@return boolean | ||||
| function Module.is_closer(position, pos1, pos2) | ||||
|     return Module.distance(pos1, position) < Module.distance(pos2, position) | ||||
| end | ||||
|  | ||||
| ---Returns true if the position is inside the area | ||||
| ---@param position MapPosition|{x:double,y:double}|nil | ||||
| ---@param area BoundingBox|{left_top:MapPosition, right_bottom:MapPosition} | ||||
| ---@return boolean | ||||
| function Module.inside(position, area) | ||||
|     if not position then | ||||
|         return false | ||||
|     end | ||||
|  | ||||
|     local lt = area.left_top | ||||
|     local rb = area.right_bottom | ||||
|  | ||||
|     return position.x >= lt.x and position.y >= lt.y and position.x <= rb.x and position.y <= rb.y | ||||
| end | ||||
|  | ||||
| ---rounds number (num) to certain number of decimal places (idp) | ||||
| function math.round(num, idp) | ||||
|     local mult = 10 ^ (idp or 0) | ||||
|     return math.floor(num * mult + 0.5) / mult | ||||
| end | ||||
|  | ||||
| function math.clamp(num, min, max) | ||||
|     if num < min then | ||||
|         return min | ||||
|     elseif num > max then | ||||
|         return max | ||||
|     else | ||||
|         return num | ||||
|     end | ||||
| end | ||||
|  | ||||
| function Module.print_except(msg, player) | ||||
|     for _, p in pairs(game.players) do | ||||
|         if p.connected and p ~= player then | ||||
|   | ||||
		Reference in New Issue
	
	Block a user