小编Jas*_*rff的帖子

检测闭合Bezier曲线中的自交叉

我通过将立方贝塞尔曲线拼接在一起创建了一个"blob"形状(截图如下).我希望能够检测到曲线越过自身或其他曲线的情况,并且想知道是否有推荐的方法或已知的算法来执行此操作?

我的一个想法是使用a FlatteningPathIterator将形状分解为直线段然后检测给定的段是否与另一个段相交,但我对是否有更好的方法感兴趣(因为这将具有二次性能).如果我继续追求这种方法,Java中的库函数是否检测两个线段是否重叠?

谢谢.

没有交叉

No Crossover http://www.freeimagehosting.net/uploads/7ad585414d.png

交叉

交叉http://www.freeimagehosting.net/uploads/823748f8bb.png

java algorithm geometry bezier java-2d

10
推荐指数
1
解决办法
2402
查看次数

Python threading.Event() - 确保在event.set()上唤醒所有等待的线程

我有许多线程等待事件,执行一些操作,然后再次等待事件.另一个线程将在适当的时候触发事件.

我无法找到一种方法来确保每个等待的线程在设置事件时恰好触发一次.我目前有触发线程设置它,睡了一会儿,然后清除它.不幸的是,这导致等待线程多次抓住设置事件,或者根本没有.

我不能简单地让触发线程产生响应线程来运行它们一次,因为它们是对来自其他地方的请求的响应.

简而言之:在Python中,我如何让线程设置一个事件并确保每个等待线程在被清除之前只对事件执行一次?

更新:

我已经尝试使用锁和队列进行设置,但它不起作用.这就是我所拥有的:

# Globals - used to synch threads
waitingOnEvent = Queue.Queue
MainEvent = threading.Event()
MainEvent.clear()    # Not sure this is necessary, but figured I'd be safe
mainLock = threading.Lock()

def waitCall():
    mainLock.acquire()
    waitingOnEvent.put("waiting")
    mainLock.release()
    MainEvent.wait()
    waitingOnEvent.get(False)
    waitingOnEvent.task_done()
    #do stuff
    return

def triggerCall():
    mainLock.acquire()
    itemsinq = waitingOnEvent.qsize()
    MainEvent.set()
    waitingOnEvent.join()
    MainEvent.clear()
    mainLock.release()
    return
Run Code Online (Sandbox Code Playgroud)

itemsinq第一次正确反映了等待的呼叫数量,但只有第一个等待线程才能通过.从那时起,itemsinq始终为1,等待的线程轮流; 每次触发调用发生时,下一次触发.

更新2 似乎只有一个event.wait()线程正在唤醒,但queue.join()正在运行.这告诉我一个等待线程被唤醒,从队列中获取并调用task_done(),并且单个get()/ task_done()以某种方式清空队列并允许join().触发器线程然后完成join(),清除事件,从而防止其他等待线程通过.为什么只有一次get/task_done调用之后队列才会注册为空/完成?

只有一个似乎在醒来,即使我注释掉queue.get()和queue.task_done()并挂起触发器以便它无法清除事件.

python events multithreading

10
推荐指数
1
解决办法
2万
查看次数

如何比较"if"语句中的字符串?

我想测试并查看"char"类型的变量是否可以与常规字符串(如"cheese")进行比较,以进行比较,例如:

#include <stdio.h>

int main()
{
    char favoriteDairyProduct[30];

    scanf("%s",favoriteDairyProduct);

    if(favoriteDairyProduct == "cheese")
    {
        printf("You like cheese too!");
    }
    else
    {
        printf("I like cheese more.");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(我实际想做的事情比这要长得多,但这是我坚持的主要部分.)那么如何比较C中的两个字符串呢?

c string

10
推荐指数
2
解决办法
11万
查看次数

如何读取Inform 7中的输入行?

我只想提示用户在操作过程中输入一行文本.效果应该是这样的:

> north

The robot steps in front of you as you approach the gate.
"PAASSWAAAAWRD!!" it bellows.

Enter the password: _
Run Code Online (Sandbox Code Playgroud)

此时游戏应暂停并让玩家尝试猜测密码.例如,假设我猜"fribble",这不是密码:

Enter the password: fribble

"WRONG PASSWAAARD!" roars the robot. "CHECK CAPS LAAAWWWWK!"

>
Run Code Online (Sandbox Code Playgroud)

我想要的行为类似于if the player consents,但我想要整行输入,而不仅仅是是或否.

inform7

9
推荐指数
2
解决办法
1485
查看次数

在 C 中,“+=”和“+”对相同的“float”操作数给出不同的答案是否合法?

我的理解是,在C中,

  • float加法和乘法是确定性的;和
  • A += B应该表现得像A = A + BA 没有副作用时一样。

那么,为什么这个程序中的断言会失败呢?

#include <stdio.h>
#include <assert.h>

void trial(long long i, float *src, float *target, float g) {
  float a = target[i];
  float x = g * src[i];
  printf("%g %g %g\n", a, x, a + x);
  target[i] += g * src[i];
  assert(target[i] == a + x);
}

int main() {
  float target[2] = { 0.0, -4.52271e-06 };
  float src[2] = { -0.000926437, -0.00102722 };

  trial(1, src, …
Run Code Online (Sandbox Code Playgroud)

c floating-point

9
推荐指数
1
解决办法
248
查看次数

如何计算将一个排序顺序转换为另一个排序顺序的绝对最小变化量?

目标

如何编码描述如何使用可能的最小字节数将静态列表从一个订单重新排序到另一个订单的数据?

原始动机

最初,在使用昂贵的卫星通信来处理传感器数据的问题时,出现了这个问题.一台设备列出了他们正在监控的大约1,000个传感器.传感器列表无法更改.每个传感器都有一个唯一的ID.所有数据都在内部记录以进行最终分析,最终用户每天唯一需要的是哪个传感器以哪种顺序触发.

整个项目都被废弃,但这个问题似乎太有趣了,不容忽视.此前我还谈到了"交换",因为我正在考虑排序算法,但实际上它是整体​​顺序很重要,达到该顺序所需的步骤可能无关紧要.

如何订购数据

在SQL术语中,你可以这样想.

**Initial Load**

create table sensor ( id int, last_detected datetime, other stuff )
-- fill table with ids of all sensors for this location

Day 0: Select ID from Sensor order by id
  (initially data is sorted by the sensor.id because its a known value)

Day 1: Select ID from Sensor order by last_detected
Day 2: Select ID from Sensor order by last_detected
Day 3: Select ID from Sensor order by last_detected
Run Code Online (Sandbox Code Playgroud)

假设 …

sorting algorithm optimization computer-science

8
推荐指数
1
解决办法
260
查看次数

如何让"内部"和"南部"通过Inform 7中的一扇门?

假设我们有:

风暴门是一扇关闭的门.它位于花园的南面和棚屋的北面.

以下命令都可以正常通过花园的门:

  • 小号
  • 穿过风暴门
  • 经过
  • 进门

但是进去不起作用:

>进去

你不能那样走.

我找不到合理的方法让它发挥作用.我能做的最好的就是这个,这看起来很荒谬:

在花园里面是Tumbolia.在棚子外面是Tumbolia.

而不是从花园去Tumbolia,尝试进入风暴门.

而不是从棚屋前往Tumbolia,尝试进入风暴门.

inform7

7
推荐指数
2
解决办法
681
查看次数

如何在特定日期之前获得某个版本的SourceSafe项目?

我正在使用SourceSafe Explorer v8.0.我将SourceSafe中的现有项目导入VS 2008,处理该项目并进行了几次检查.

现在我需要将相同的项目导入到不同的文件夹中,但是在我开始处理它之前的版本.我看到了"获取最新"选项.获取某个旧版本的选项在哪里?

visual-sourcesafe visual-studio

6
推荐指数
1
解决办法
5012
查看次数

如何在一段时间内传播流程,获得最少数量的"冲突"

我正在为嵌入式系统开发调度程序.该调度程序将每隔X毫秒调用每个进程; 当然,这个时间可以为每个过程单独配置.

一切都被编码,并按照应有的方式调用每个进程; 我面临的问题是:想象一下我分别每10,15,5和30毫秒调用4个进程:

A: 10ms
B: 15ms  
C: 5ms 
D: 30ms
Run Code Online (Sandbox Code Playgroud)

随着时间推移产生的呼叫将是:

                       A          |
       A   B   A       B          |
    C  C   C   C   C   C   C      | processes being called
                       D          |
----------------------------------
0   5  10  15  20  25  30  35...    ms
Run Code Online (Sandbox Code Playgroud)

问题是当达到30ms时,所有进程都在同一时刻(一个接一个)被调用,这可能会延迟从这里开始的正确执行.

这可以通过为每个进程添加延迟(但保留其调用频率)来解决,因此频率停止是彼此的倍数.我的问题是我不知道如何计算应用于每个过程的延迟,因此最小化了碰撞次数.

是否有任何已知的算法或一些数学指导?

谢谢.

algorithm math scheduling

6
推荐指数
1
解决办法
335
查看次数

Python循环:以惯用方式比较列表中的连续项

我需要循环一个对象列表,比较它们是这样的:0对1,1对2,2对3等等(我正在使用pysvn来提取差异列表.)我结束了循环索引,但我一直想知道是否有某种方法可以做到更贴近惯用.这是Python; 我不应该以某种聪明的方式使用迭代器吗?简单地循环索引似乎很清楚,但我想知道是否有更具表现力或简洁的方法来做到这一点.

for revindex in xrange(len(dm_revisions) - 1):
    summary = \
        svn.diff_summarize(svn_path,
                          revision1=dm_revisions[revindex],
                          revision2 = dm_revisions[revindex+1])
Run Code Online (Sandbox Code Playgroud)

python iterator loops

6
推荐指数
1
解决办法
4006
查看次数