- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个 Python 程序来生成海因莱因著名小说 The Moon is a Harsh Mistress 中的 Luna Free State 旗帜。 ,作为个人项目。我一直在抄袭网络上的纹章规则和匹配数学公式,但我的 bendsinister
例程显然有问题,因为断言在未注释时失败。险恶弯曲的面积应该是旗帜总面积的 1/3,但事实并非如此。我做过的唯一真正狡猾的事情是猜测梯形高度的公式,但我猜错误可能在任何地方。我已经删除了大部分代码,只留下显示问题所必需的代码。希望数学水平较低的人能够发现错误!
#!/usr/bin/python
'generate bend sinister according to rules of heraldry'
import sys, os, random, math, Image, ImageDraw
FLAG = Image.new('RGB', (900, 600), 'black')
CANVAS = ImageDraw.Draw(FLAG)
DEBUGGING = True
def bendsinister(image = FLAG, draw = CANVAS):
'''a bend sinister covers 1/3 of the field, sinister chief to dexter base
(some sources on the web say 1/5 of the field, but we'll use 1/3)
the "field" in this case being the area of the flag, so we need to
find a trapezoid which is 1/6 the total area (width * height).
we need to return only the width of the diagonal, which is double
the height of the calculated trapezoid
'''
x, y = image.size
b = math.sqrt((x ** 2) + (y ** 2))
A = float(x * y)
debug('%d * %d = %d' % (x, y, A))
H = triangle_height(A / 2, b) # height of triangular half of flag
width = trapezoid_height(b, H, A / 6) * 2
if command == 'bendsinister':
show_bendsinister(x, y, width, image, draw)
return width
def show_bendsinister(x, y, width, image = FLAG, draw = CANVAS):
'for debugging formula'
dexter_base, sinister_chief = (0, y), (x, 0)
draw.line((dexter_base, sinister_chief), 'blue', int(width))
image.show()
debug(image.getcolors(2)) # should be twice as many black pixels as blue
def triangle_height(a, b):
'a=bh/2'
h = float(a) / (float(b) / 2)
debug('triangle height: %.2f' % h)
return h
def trapezoid_height(b, H, a):
'''calculate trapezoid height (h) given the area (a) of the trapezoid and
base b, the longer base, when it is known that the trapezoid is a section
of a triangle of height H, such that the top, t, equals b when h=0 and
t=0 when h=H. h is therefore inversely proportional to t with the formula
t=(1-(h/H))*b, found simply by looking for what fit the two extremes.
the area of a trapezoid is simply the height times the average length of
the two bases, b and t, i.e.: a=h*((b+t)/2). the formula reduces
then to (2*a)/b=(2*h)+(h**2)/H, which is the quadratic equation
(1/H)*(h**2)+(2*h)-((2*a)/b)=0; solve for h using the quadratic formula
'''
try:
h = (-2 + math.sqrt(4 - 4 * (1.0 / H) * -((2 * a) / b))) / (2 * (1.0 / H))
debug('trapezoid height with plus: %.2f' % h)
except: # must be imaginary, so try minus instead
h = (-2 - math.sqrt(4 - 4 * (1.0 / H) * -((2 * a) / b))) / (2 * (1.0 / H))
debug('trapezoid height with minus: %.2f' % h)
t = (1 - (float(h) / H)) * b
debug('t=%d, a=%d, check=%d' % (t, round(a), round(h * ((b + t) / 2))))
#assert round(a) == round(h * ((b + t) / 2))
return h
def debug(message):
if DEBUGGING:
print >>sys.stderr, message
if __name__ == '__main__':
command = os.path.splitext(os.path.basename(sys.argv[0]))[0]
print eval(command)(*sys.argv[1:]) or ''
这是调试输出,显示我离 1/3 区域很远:
jcomeau@intrepid:~/rentacoder/jcomeau/tanstaafl$ ./bendsinister.py 900 * 600 = 540000triangle height: 499.23trapezoid height with plus: 77.23t=914, a=90000, check=77077[(154427, (0, 0, 255)), (385573, (0, 0, 0))]154.462354191
这是输出图像,添加了一些行: 红线分出两个三角形,都可以用来计算梯形。我正在使用从左上角开始的那个。绿线就是那个三角形的高,就是程序中的变量H。
最佳答案
将矩形分成两个三角形。它们将是相同的。
黑色三角形+蓝色梯形是三角形A。黑色三角形本身就是三角形 B
三角形 A 和三角形 B 是相似三角形,因此它们的面积与相关比例因子的平方相关。
我们希望蓝色梯形占三角形 A 面积的三分之一。(这样弯曲将占据整个矩形的三分之一)。这意味着三角形 B 必须是三角形 A 的 2/3 面积。因此比例因子必须是 sqrt(2/3)。
然后您应该能够轻松地将其转换为弯曲几何体的坐标。
关于python - 糟糕的数学或糟糕的编程,也许两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5786573/
我做了一些研究,但没有找到任何东西。我不明白这样的函数是如何工作的: func :: Maybe (Int) -> Maybe (Int) 我应该如何进行模式匹配?我已经尝试过,但没有成功: func
我需要从屏幕上删除一个元素,然后重新生成一个具有相同名称的元素。 代码中有一个deleteObject函数和一个appendChild调用。 在deleteObject函数中,它使用removeChi
我读了一些关于 monad 的帖子和博客,也许,只是,什么都没有..但并没有真正明白:/在给定的代码中,我必须实现“latestActivity”函数。在我看来,它应该有效,但我不知道如何正确使用“J
在功能光学中,一个性能良好的棱镜(我相信在 scala 中称为部分透镜)应该具有 'subpart -> 'parent -> 类型的 set 函数'parent,如果棱镜“成功”并且在结构上与给定的
有输入文件;未排序的长类型数字。(约100万)我想对输入文件中的数字进行排序。为了分配数组的内存,我使用了fseek和ftell。但出现段错误。如何修复代码? int main( int argc,
我仍在尝试从单元格收集信息,使用该信息执行函数,然后将结果返回到不同的单元格。我知道这是可能的,但我正在努力解决这个问题。我在这里收到的许多提示引导我找到了以我理解的方式表达的大量信息。我希望这种事能
所以我正在制作一个小型命令行彩票游戏(代码中的注释解释了一切),但是当我生成随机数时,我的代码并没有像我希望的那样将其缩短为三位数,除了游戏可以运行并且可以玩之外,除了偶尔有一个随机生成的数字超过一千
这是另一种情况,在 C++ 中空格很重要,还是编译器错误?以下代码在语法上是否正确? #include template using EnableIf = typename std::enable
我参加了一个 PHP 工作面试,我被要求实现一段代码来检测访问者是否是爬行网站并窃取内容的机器人。 因此,我实现了几行代码,通过使用 session 变量存储上次访问时间戳来检测网站是否刷新/访问过快
我有一个List (Maybe a),我想过滤出Nothing的实例。我大概已经做到了,但是对所需的代码量却不满意: removeNothingFromList : List (Maybe a) ->
有谁知道任何指定场所开放时间的本体?例如,我有一个博物馆,有 2 个季节。淡季(指定季节起止),平日10-18:00,周六10-16(周日休息),旺季平日10-20,周末10-18。 如果没有本体,也
我有this代码(接受的解决方案)。此代码从 js 文件中截取加载。当我在此函数处放置断点时,我看到该函数在加载页面(包含它)时被调用。 初始页面加载后,当我在此页面中选择一个选项时,该 anchor
step :: [Int] -> String -> [Int] step (x:y:ys) "*" = (x*y):ys step (x:y:ys) "+" = (x + y):ys step (x
我正在尝试找到将以下有状态命令式代码转换为纯函数表示的最优雅的方法(最好在 Haskell 中使用其 Monad 实现提供的抽象)。然而,我还不擅长使用变压器等组合不同的单子(monad)。在我看来,
我希望它更方便地使用库定义的partialfunc,或者使用部分模式匹配编写回调。 像这样, partialMaybe :: forall a b. (Partial => a -> b) -> a
一周前,我在代码中编写了一个名为 getline 的函数,但该函数不起作用。从那时起,每当我将函数命名为 getline 并尝试编译它时,它都不起作用。如果我将函数名称更改为其他名称,它会再次起作用。
下面的代码有问题 package com.example.ch13_searchflickrr; import android.os.Bundle; import android.support.v7
我有这个需求,并且我使用的是MySQl数据库 评论表 id user id ariticle_id comment comment date ================
是否有 IDE 或软件可以为我的 C++ 程序计时?我目前正在使用 Visual Studio 2010,所以如果有功能可以帮助解决这个问题,我将不胜感激。 最佳答案 您将需要使用 Profiler。
我是 C# 的新手,正在研究它的可能性。 现在我对使用泛型的方式有点困惑...列出泛型的种类。我想在单个父类中创建一个基本的列表功能,只需命名我的子类应包含的类类型。 比如说,我创建了一个类 clas
我是一名优秀的程序员,十分优秀!