/tmp/duangsuse.sock
23 subscribers
303 photos
3 videos
92 files
337 links
从 duangsuse::Echo (@dsuse) 跟进出来的分支,将在作者恢复原帐号访问的时候合并删除。
Download Telegram
Forwarded from Deleted Account
帮我转换个 HTML 文档到 Markdown 行不行...
Forwarded from Deleted Account
这里修的万分淡疼、Bash、AWK、SED、Coreutils,我马上 perl 都要用上了,可是我已经花了一个小时了,干脆不要用 Pandoc 算了
Forwarded from Deleted Account
这里对打包的版本问题真的没救了,不仅 dirty 而且还很麻烦,我很久没有弄好...
Forwarded from Deleted Account
对 drakeet 的一些话 – Telegraph.html
63 KB
这一篇 看 -help 吧
Forwarded from Deleted Account
Forwarded from Deleted Account
python -mpip install --user html2txt
Forwarded from Pan 🍳
你乾脆分析 DOM 然後一條一條新增……
Forwarded from Deleted Account
如果不是有现成的,我会选择使用 DOM / Java SAX + Visitor Pattern 自己从文档树生成 Markdown 输出
Forwarded from Deleted Account
thx, 现在不需要 pandoc 去转换了
Forwarded from Deleted Account
It works
Deleted Account
如果不是有现成的,我会选择使用 DOM / Java SAX + Visitor Pattern 自己从文档树生成 Markdown 输出
Visitor Pattern 应该也可以是 stateful 的,不过我不知道应该怎么传递对象局部的 state... 我想可以给 visitor 对象本身添加状态,这样使用他们就可以做各种属性配置
https://github.com/Alivon/Panda-Learning/issues #China #Low #GitHub... 🤔🇨🇳,., #tool
果然,GitHub 还是被当成贴吧用了

项目的水平我觉得还可以,就是贴了很多 badge 我却没有发现一个 Code coverage 的
Commit log 基本都没有写

Python 100%,

应用 CLI 支持四个参数:user, dead/alive(fg|bg), hardcore/softcore(threaded|single), timeout
https://github.com/ice1k/FindLine... 虽然代码风格不好,但还是看到了我意料之外的东西(之前一直以为 init {} 块是用来初始化类本身的... 现在想来,Kotlin 里类其实还是很特别的... 真正能被访问的不是类,只有对象,所以 companion object 的 init 才应该是构造器?而且我不知道 META-INF/ 还可以直接放)

简单说一下不重要的 utils 包, debug:logstdout, Binarization:二值化, java:没用的Boolean矩阵, exceptions不说了
Config 文件就是几个常量

这个项目本来是计算机图形学学习的(主要是一种简单的点枚举判断位图绘制法)
可惜最后没有成功,2016 年嘛... 唉,果然是赶不上的

typealias Axis = Int
Point(Axis x, Axis y)
Position 本身是一个没必要放其他文件的 Point 扩展,计算象限...(cmp 0)
Line(Point a, Point b) { val set: HashSet<Point> }
Area(Point lt, Point rd) 噢不
Area(val img: BufferedImage)


回头看了发现这居然是 2016 年的东西... 有三年了,

但最重要的是,2016 年冰封就开始 Kotlin 编程了,而且使用了 Java 和 Groovy DSL... 虽然我觉得这就不奇怪了
This media is not supported in your browser
VIEW IN TELEGRAM
/tmp/duangsuse.sock
... 我看了一下,发现自己对 Line 连起来那个 a, b, c 的综合还弄不清楚,待会我去讲一下
人与人之间的差距:大佬已经站在云端,我仍然活在泥里连数学都没有入门
/tmp/duangsuse.sock
https://github.com/ice1k/FindLine... 虽然代码风格不好,但还是看到了我意料之外的东西(之前一直以为 init {} 块是用来初始化类本身的... 现在想来,Kotlin 里类其实还是很特别的... 真正能被访问的不是类,只有对象,所以 companion object 的 init 才应该是构造器?而且我不知道 META-INF/ 还可以直接放) 简单说一下不重要的 utils 包, debug:logstdout, Binarization:二值化, java:没用的Boolean矩阵…
模型的总结:

Area(其实这个和 Box 有点混淆的说):就是一个 java.awt.image.BufferedImage 的扩展

+ 可以 draw 一个 Point
+ 可以 drawLine 一组 Point 构成的 Line
+ 可以 drawTriangle 一组 Line 构成的 Triangle

fun draw(points: Set<Point>) = points.forEach { p -> draw(p) }
fun draw(p: Point) = image.setRGB(p.x, p.y, if (this[p.x, p.y]) Color.BLUE.rgb else Color.ORANGE.rgb)

对于扩展, operator fun get(x: Axis, y: Axis) = Binarization.rgb2bw(super(x, y)),... 好吧,其实原来的版本是二值化滥用了(而且不得不说三年前冰封的编程风格也很... 虽然风格不好但是算法也能写的)
返回 Boolean, true 代表 B、false 代表 W...(所以 utils 包里有 java.BooleanMap,我开始还以为是位运算压缩)

protected infix fun Point.connect(point: Point): Boolean
fun init()

这两个操作,写的质量都有点...(的确是这样的...)

protected fun Point.legal()

虽然限制了 Point 原来的定义(本来主要打算是用作 Position.... 怎么感觉又混淆了)
但是也不至于很差

@Deprecated("Will take too much time") fun getArea(point: Point): Set<Point>

用到了 BooleanMap 和 LinkedBlockingQueue...
看的时候觉得 queue.pool().surrounded() 会是调用 Point 的操作,不得不检查了一下 class Point 的定义
总之就是 BFS (广度优先搜索)这个 Point,如果 legal (在 Area 里)并且是 Area 的 pos 是 black 的话,就加入点集合里

而且还不能是输入的点 p... 什么鬼

val mark = BooleanMap(origin.width, origin.height)
queue.put(p)

while (queue.isNotEmpty()) {
val p0 = queue.peek()
mark[p0.y][p0.x] = true
set.add(p0)
val ps = queue.poll().surround().filter { it.legal() && it.rgbFrom(this) == RGB_BLACK && mark[it.y][it.x] == false }
queue.addAll(ps)
}
... 噢
我明白了,的确这个 BFS 程序利用 mark 的副作用操作,这样就只有某块区域边角才能被标记出来...

四周,只要 valid 都可以
mark 之前是优先添加的,不过这... 好吧,看来这只是一种解决无限循环问题的方式而已 😮

(如果要『只有边角被标记』,判断 marks 是否包含这一点,不包含则添加?)
...总之单靠 bfs 应该还是可以做到?不过有点麻烦,可能涉及一些点的计算
边缘检测是矩阵求卷积然后二值化的...

Point 的计算就是 distance, surround 没了
distance 就是毕加哥拉斯公式嘛(勾股定理...)
sqrt( (p1.x - p0.x)^2 + (p1.y - p.y)^2 )
考虑一下边长^2 = 面积... 好像没啥关系

噢是有关系的,考虑到『点之间的距离』,我们想到的是 f(p0, p1),并且两点『距离』越大值越大(否则正好相反)
这就是性质定义,为什么不把从『面积』公式修改呢?
于是就:
(p1.x - p0.x)^2 + (p1.y - p.y)^2
再开方(顺便就绝对值了)得到了距离(注意不能提升 ^2 到 (+) 之上)
(+) 是混合项目用的操作符
数形结合是一种优秀的思维方式,并且必须要使用。


Position 就是象限的计算,不过这里有个『优化』(虽然比较 hack...

g += if (x >=0) 1 else 2
g += if (y >=0) 0 else 3
if (g == 5) g = 3

我们来分析一下常量控制流

x >=0 => g = 1 (第一象限 x < 0、y < 0)
x < 0 => g = 2(第二象限 x > 0、y < 0)
y >=0 => g += 0
y <0 => g += 3

值得注意的是这个 y,当 y 小于零

x >= 0 => g = 1+3 = 4(第四象限 x > 0, y < 0)
x < 0 => g = 1+0 = 3(第三象限 y < 0, x > 0)

怎么『构造』这种优化可以手动堆(因为这种加减法不是很难,何况你对应一下,从 y 的 case 往下分支也就可以了)
也可以按照固定的模式转化,以后可能会有分析

后面的 if (==5) 本来应该是死代码... 虽然因为封装的不好,可能就没有那么死了
等等不是死代码,2+3 可能等于 5... 这种情况就是 (x,y -> >0 的情况)

2|1
4|3

Triangle(Point a, Point b, Point c) 这个没啥好说的,连 sin cos 都没用到
setOf((a, b) (b, c) (c, a)).forEach(::draw) 即可

最后要点:也是我绝对不会的,因为目前我数学和几何很菜

Line.kt

问题:如何枚举线段 (x0, y0) — (x1, y1) 里的点 🤔

private val a = two.y - one.y
private val b = one.x - two.x
private val c = two.x * one.y - one.x * two.y

这是三个对 xy 进行综合的量,前两个一看就知道,
后一个需要思考一下,为什么要进行交叉?
如果没有图示的话还的确不 immediate

我画图....
比较简陋...
/tmp/duangsuse.sock
比较简陋...
就可以 immediate 地发现一点:其实两个乘法都构筑了一个长方形的面积(最开始我没有这个感觉,因为对命名来说太不可思议了)

他们的减可以表示一个... 综合了方向的差
关键是 a.x 和 b.y 要交叉乘,然后减法就算出了这个矢量差

A(2, 10) B(1,0)
算得 c 有两个 case,其中两个参数分别为
(2 * 0) — (1 * 10)

1. (2 * 0) - (1 * 10) = (-10)
2. (1 * 10) - (2 * 0) = 10

... 因为正好是相反数,所以应该说,矢量差是正确的(虽然好像都是这样吧...
/tmp/duangsuse.sock
比较简陋...
This media is not supported in your browser
VIEW IN TELEGRAM