Skip to content

Instantly share code, notes, and snippets.

@aduffey
Created December 23, 2023 03:47
Show Gist options
  • Save aduffey/d098132676fb566a0d766aefb4199efb to your computer and use it in GitHub Desktop.
Save aduffey/d098132676fb566a0d766aefb4199efb to your computer and use it in GitHub Desktop.
CRT simulation work
from imageio.v3 import imwrite
import numpy as np
def cos_isotropic_spot(x, y, s):
"""Takes scalar x, scalar y, and vector s"""
return sqrt(s) * (0.5 + 0.5 * np.cos(np.pi * np.clip(np.divide(np.sqrt(x**2 + y**2), sqrt(s), out=np.zeros_like(s), where=horiz!=0), -1, 1)))
def line(x, y, s):
"""Takes scalar x, scalar y, and vector s"""
np.trapz(cos_isotropic_spot(x, y, s),
def linear_to_srgb(img):
"""Linear float to sRGB uint8"""
out = np.where(img < 0.0031308, img * 12.92, 1.055 * (np.power(img, (1.0 / 2.4))) - 0.055)
out = (img * 255).astype(np.uint8)
return out
def main():
xaxis = np.linspace(0, 320, 3200)
yaxis = np.linspace(-2, 2, 40)
taxis = np.linspace(0, 320, 3200)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "54f81348",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"t"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var('t')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "fade9832",
"metadata": {},
"outputs": [],
"source": [
"L = 2"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "8399348d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"piecewise(t|-->0.250000000000000*cos(1/2*pi*t) + 0.250000000000000 on (-2, 2); t)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g = piecewise([[(-L, L), (1 / L) * (0.5 + 0.5 * cos(pi*t/L))]], var=t); g"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4f8714ca",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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jpyI9zgOtGpl/lyzRl05T1JHzoKXX4Zjx9SNE/GGhIQEIiMjiYmJsR1FJGAc78p99RUsXWo7jX9TR87L9u833bgHHzSLHUTEO9SRE/Eux4EWLcwWW6tWqSvnKerIednEiWYCaN++tpOIiIh4zvGu3OrVsGyZ7TT+Sx05L8rMhBo1oEuX/y12EBHvUEdOxPscB2JioFw5WLHCdhr/pI6cF02aBIcOwdNP204iIiLiece7citXqpDzFHXkvCQry8yNu+suU9CJiHepIydih+NA06bmBKMvvrCdxv+oI+cliYlw4AD07287iYiIiPcc78otW2YWPUjJUkfOCw4eNN24226DyZNtpxEJTOrIidiTmwtNmkDlypCUZDuNf1FHzgsmT4aMDHXjREQkMJUqBc88Y/aUW7PGdhr/oo6ch/31F9SqBZ06wbRpttOIBC515ETsys2Fyy6D6tXh009tp/Ef6sh52LRp5kiuAQNsJxEREbHneFfus89g3TrbafyHOnIedOgQXHwxXH89vP667TQigU0dORH7cnKgYUPzs/Hjj22n8Q/qyHnQa6/BH3/AwIG2k4iIiNgXHGy6cosXw8aNttP4B3XkPOTwYahdG669Ft54w3YaEVFHTsQ35ORAZCTUqwcffGA7jfupI+ch06dDejoMGmQ7iYiIiO8IDobBg+HDDyE52XYa91NHzgOys+GSS6BNG3jzTdtpRATUkRPxJceOQYMGZr7cggW207ibOnIeMHMm7NxpfuMQEbsSEhKIjIwkJibGdhQR+X8hIWbEauFC2LzZdhp3U0euhB05AnXqQMuWMGeO7TQicpw6ciK+5ehRM0+uaVN47z3badxLHbkSNns27NihbpyIiMiplC5tunLz58O339pO417qyJWg479dREfDvHm204jI36kjJ+J7jhyBunWheXOYO9d2GndSR64EvfUW/PKLunEiIiKFERpqziF/91348UfbadxJHbkSkpNjVuBceqlW4Ij4InXkRHzT8X1Xr7vOLBaUolFHroS8+y5s26ZunIiISFGEh0Pfvma7rl9/tZ3GfdSRKwG5udC4MVSvDp98YjuNiJyIOnIivuvgQahVC269FSZPtp3GXdSRKwEffmhW3KgbJyIiUnTlykHv3uZUpJ07badxF3XkzpDjmNU2ZcvC8uW204jIyagjJ+LbMjOhRg24/34YP952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bipfEREREV8QEmL2lXv3Xfj5Z9tpfLQj5zimE1exIiQl2U4jIv5AHTkRKSnH5/DfcotZlGmTT3bkli41Y8/qxomIiIivKVPG7KYxYwbs2mU3i08WcqNGmVUhbdvaTiIiIiJS0KOPQunS8PLLdnP4XCG3cSN8/rnZqyUoyHYaERERkYIqVIBu3SAxETIz7eXwuUJu1Ci45BIz7iwiIiLiq3r1gr/+gqlT7WXwqUJu2zazWvWppyA42HYaERERkZO74AK47z4YPx6ys+1k8KlCbswYs1tyly62k4iIiIicXt++kJ4Os2fbeX6fKeTS0mDmTNOmDA+3nUZERETk9OrVM0eJvvQS5OR4//l9ppB7+WUICzMTB0VERETcol8/+OknWLTI+8/tE4VcRobZUK9bNzjnHNtpRERERAqvWTO46iqzYNPbxyz4RCE3dSocPmyGVUVERETc5umnYf16WLHCu89rvZA7fNis9oiPh/PPt51GRPxNQkICkZGRxMTE2I4iIn6sQwe47DLTlfMm62etvvoqdO0K339vJgyKiHiCzloVEU976y24915ISYHGjb3znFYLuZwcaNAAGjUy+8eJiHiKCjkR8bRjx8yhBq1amaLOG6wOrS5caDYB7tfPZgoRERGRMxcSAk8+CXPnwq+/euc5rXXkHAeaN4dy5WDZMhsJRCSQqCMnIt5w8CDUqAF33w0TJ3r++ax15JYtgw0boH9/WwlERERESla5ctCjB7z2GuzZ4/nns1bIjRoFl18O7drZSiAiIiJS8nr0MH9OmuT557JSyCUnw5IlZs+VoCAbCUREREQ8o1IleOgheOUVM9TqSVYKudGjoVYtuP12G88uIiIi4ll9+piTq15/3bPP4/VC7uefYd48s6ojJMTbzy4iIiLieTVrwp13wtixcPSo557H64Xc2LFQsSI88IC3n1lERETEe55+GlJTTQPLU7xayO3eDTNmwBNPQNmy3nxmEfGmxMREatWqRXh4OFFRUaxateqkt33//fe57rrrOO+88yhfvjyxsbF89tln+W4zc+ZMgoKCClwOHz7s6ZciIlJsl11mju4aPdpsu+YJXi3kJk6E4GB47DFvPquIeNPcuXPp1asXgwYNIjk5mdatW9OxY0dSU1NPePuVK1dy3XXXsXjxYjZt2sTVV1/NTTfdRHJycr7blS9fnrS0tHyX8PBw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FD9Skp8/PlXIpaenA1ClSpV811epUiXvexIY0tPTqVy5coHrK1eufMr3QseOHXnrrbf44osvGDt2LBs2bOCaa64hOzvbk3HFsj179pCTk1Okz4709PQT3v7YsWPs2bPHY1nF9xTn/VOtWjWmTZvG/Pnzef/996lXrx5t27Zl5cqV3ogsLleSnz8hRX3y5557jqFDh57yNhs2bCA6OrqoD50nKCgo39eO4xS4TtypsO8fKPg+gNO/F+Li4vL+u2HDhkRHR1OjRg0+/vhjbrnllmKmFrco6mfHiW5/ouslMBTl/VOvXj3q1auX93VsbCw7duxgzJgxXHnllR7NKf6hpD5/ilzI9ejRgzvvvPOUt6lZs2ZRHxaAqlWrAqZSrVatWt71u3fvLlC5ijsV9v3zzTffsGvXrgLf++OPP4r0XqhWrRo1atRg27ZtRc4q7lGpUiWCg4MLdE9O9dlRtWrVE94+JCSEihUreiyr+J7ivH9OpEWLFrz55pslHU/8UEl+/hS5kKtUqRKVKlUq6t0KpVatWlStWpWkpCSaNGkCmLkLK1asYNSoUR55TvGuwr5/YmNjycjIYP369TRr1gyAdevWkZGRQcuWLQv9fHv37mXHjh35fjEQ/xMaGkpUVBRJSUncfPPNedcnJSXRqVOnE94nNjaWDz/8MN91S5YsITo6mtKlS3s0r/iW4rx/TiQ5OVmfNVIoJfr5U+TlEUXw22+/OcnJyc7QoUOds846y0lOTnaSk5OdrKysvNvUq1fPef/99/O+HjlypBMREeG8//77zpYtW5y77rrLqVatmpOZmenJqOKDOnTo4Fx22WXO2rVrnbVr1zqNGjVybrzxxny3+fv7Jysry3nyySedNWvWOL/88ouzbNkyJzY21rngggv0/gkA77zzjlO6dGnn9ddfd7777junV69eTrly5Zxff/3VcRzH6d+/vxMfH593++3btztly5Z1evfu7Xz33XfO66+/7pQuXdp57733bL0Esaio75/x48c7CxYscH766Sfn22+/dfr37+8Azvz58229BLEoKysrr8YBnHHjxjnJycnOb7/95jiOZz9/PFrIdenSxQEKXJYtW/a/AODMmDEj7+vc3FxnyJAhTtWqVZ2wsDDnyiuvdLZs2eLJmOKj9u7d69xzzz3O2Wef7Zx99tnOPffcU2Cp/9/fP3/99ZfTrl0757zzznNKly7tXHTRRU6XLl2c1NRU74cXKxISEpwaNWo4oaGhTtOmTZ0VK1bkfa9Lly5OmzZt8t1++fLlTpMmTZzQ0FCnZs2azuTJk72cWHxJUd4/o0aNcmrXru2Eh4c7FSpUcK644grn448/tpBafMHx7Wj+eenSpYvjOJ79/AlynP+fXSciIiIiruJT24+IiIiISOGpkBMRERFxKRVyIiIiIi6lQk5ERETEpVTIiYiIiLiUCjkRERERl1IhJyIiIuJSKuREREREXEqFnIiIiIhLqZATERERcSkVciIiIiIupUJORERExKX+DyU1O1hQH8T1AAAAAElFTkSuQmCC\n",
"text/plain": [
"Graphics object consisting of 1 graphics primitive"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plot(g)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "39a6c3cf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"piecewise(t|-->0.7061625060634936 on (0, 1), t|-->0.8598734995767362 on (1, 2), t|-->0.2935421215581332 on (2, 3), t|-->0.02829399964585455 on (3, 4), t|-->0.5876401651367563 on (4, 5), t|-->0.502456333399981 on (5, 6), t|-->0.03370208482709225 on (6, 7), t|-->0.8724584358001367 on (7, 8), t|-->0.20923138692300314 on (8, 9), t|-->0.8413242420211057 on (9, 10); t)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s = piecewise([((i, i+1), random()) for i in [0..9]], var=t); s"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "372aec01",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"Graphics object consisting of 1 graphics primitive"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plot(s, xmin=0, xmax=10, ymin=0, ymax=1, aspect_ratio=1)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "7f620ca1",
"metadata": {},
"outputs": [],
"source": [
"result = s.convolution(g)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "6d1d2823",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"Graphics object consisting of 1 graphics primitive"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plot(result, xmin=0, xmax=10, ymin=0, ymax=1, aspect_ratio=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9798b092",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "SageMath 9.8",
"language": "sage",
"name": "sagemath"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
from imageio.v3 import imwrite
import numpy as np
def cos_sep_spot(x, y):
return (0.5 + 0.5 * np.cos(np.pi * np.clip(x, -1, 1))) * (0.5 + 0.5 * np.cos(np.pi * np.clip(y, -1, 1)))
def cos_sep_2_spot(x, y):
horiz = 0.5 + 0.5 * np.cos(np.pi * np.clip(x, -1, 1))
return horiz * (0.5 + 0.5 * np.cos(np.pi * np.clip(np.divide(y, np.power(horiz, 1/5), out=np.zeros((800, 800)), where=horiz!=0), -1, 1)))
def cos_isotropic_spot(x, y):
return (0.5 + 0.5 * np.cos(np.pi * np.clip(np.sqrt(x**2 + y**2), -1, 1)))
def gauss_spot(x, y):
c = 1 / (2 * np.sqrt(2 * np.log(2)))
#return 1 / (np.sqrt(2 * np.pi) * c) * np.exp(-x**2 / (2 * c**2)) * np.exp(-y**2 / (2 * c**2))
return np.exp(-x**2 / (2 * c**2)) * np.exp(-y**2 / (2 * c**2))
def linear_to_srgb(img):
"""Linear float to sRGB uint8"""
out = np.where(img < 0.0031308, img * 12.92, 1.055 * (np.power(img, (1.0 / 2.4))) - 0.055)
out = (img * 255).astype(np.uint8)
return out
def main():
xaxis = np.linspace(-2, 2, 800)
yaxis = np.linspace(-2, 2, 800)
gauss_result = gauss_spot(xaxis[:,None], yaxis[None,:])
print(gauss_result[400, 400], gauss_result[500, 400])
imwrite("gauss_spot.png", linear_to_srgb(gauss_result))
cos_sep_result = cos_sep_spot(xaxis[:,None], yaxis[None,:])
print(cos_sep_result[400, 400], cos_sep_result[500, 400])
imwrite("cos_sep_spot.png", linear_to_srgb(cos_sep_result))
cos_sep_2_result = cos_sep_2_spot(xaxis[:,None], yaxis[None,:])
print(cos_sep_2_result[400, 400], cos_sep_2_result[500, 400])
imwrite("cos_sep_2_spot.png", linear_to_srgb(cos_sep_2_result))
cos_isotropic_result = cos_isotropic_spot(xaxis[:,None], yaxis[None,:])
print(cos_isotropic_result[400, 400], cos_isotropic_result[500, 400])
imwrite("cos_isotropic_spot.png", linear_to_srgb(cos_isotropic_result))
diff = np.abs(cos_isotropic_result - cos_sep_2_result) * 10
imwrite("cos_diff.png", linear_to_srgb(diff))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment