【问题标题】:how to generate heatmap for a group of points in Objective-C如何在Objective-C中为一组点生成热图
【发布时间】:2010-11-22 15:17:14
【问题描述】:

我在弄清楚如何创建热图叠加层时遇到问题:
- 点集及其对应的重复计数器
- 单点的最大重复计数器
- 单个点的最小重复计数器

如果您有任何代码示例,我将不胜感激。

编辑
我最终需要一个 UIImage 来显示地图,比如说彩虹色(红色 - 最热 -> 蓝色最冷)

我的想法是:
- 创建灰度图像
- 在每个点上用一些 alpha 绘制小灰度渐变(覆盖同一点会增加其视觉密度)
- 创建灰度图像的副本并将其命名为 heatmapImage
- 对于 heatmapImage 中的每个像素,检查像素灰度并用热梯度数组中的适当像素颜色替换它。

但不知道如何将其放入代码中。

【问题讨论】:

  • 您所描述的对于手机来说可能有点过于激烈。您将图像叠加在彼此之上的数据输入是什么? iphone 上的每个图像都是 960*640*32 字节大。如果您只增加/减少像素值,那将会消耗大量内存。

标签: iphone objective-c graphics


【解决方案1】:

按照@Goz 的回答,您可以创建一个名为HTPoint 的对象数组,以帮助创建网格。

@interface HTPoint NSObject {
    int _density;
}

enum Range {
  MaxAccumulator = 100,
  MinAccumulator = -100
}

@property (int) x
@property (int) y
@property (int) density

-(id)initWithPoint:(CGPoint)pt andDensity:(int)d;

@end

像使用图像的 CGPoint 一样使用它。覆盖密度设置器/获取器。

@implementation HTPoint

- (int) density { return _density; }
- (void) setDensity: (int) density
{
  if (density < MaxAccumulator && density > MinAccumulator)
      _density = density;
}

// Do the same for decr
- (void) incr
{
   if (_density > MaxAccumulator && _density < MinAccumulator) return; // or throw an exception
   _density ++;
}

@end

这应该可以帮助您跟踪网格本身。使用@Goz' 的答案来显示它,而不是添加'1',只需添加HTPoint. 的密度

【讨论】:

  • 谢谢,我在问题中添加了编辑。
  • @Cyprian,你熟悉NSData and UIImage?之间的转换
  • 您的 NSData 和 UIImage 链接帮助很大。谢谢。
【解决方案2】:

嗯,它相对容易。

将区域划分为固定网格(例如 64x64)。

现在扫描每个点并检查它落在哪个网格框上。然后将 1 添加到该网格框的计数器。你现在有一张密度图。随意转换和渲染。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2011-10-23
    相关资源
    最近更新 更多